Java Hashtable

1 什么是Java Hashtable

Java Hashtable类实现了一个哈希表,该哈希表是key-value键值对结构。它继承了Dictionary类并实现Map接口。

Java Hashtable类要记住的核心要点:

  • Java Hashtable是数组列表。每个列表称为存储桶。桶的位置通过调用hashcode()方法来标识。哈希表是key-value键值对结构。
  • Java Hashtable类不能存储重复元素。
  • Java Hashtable类不允许空键或空值。
  • Java Hashtable类是同步的(线程安全的)。
  • Hashtable类的初始默认容量为11,而负载因子为0.75。

2 Java Hashtable的语法

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable  

3 Java Hashtable的构造方法

构造方法 描述
Hashtable() 创建一个具有初始默认容量和负载因子的空Hashtable。
Hashtable(int capacity) 接受一个整数参数,并创建一个包含指定初始容量的Hashtable。
Hashtable(int capacity, float loadFactor) 用于创建具有指定初始容量和负载因子的Hashtable。
Hashtable(Map<? extends K,? extends V> t) 使用给定的Map创建一个新的Hashtable。

4 Java Hashtable的方法

方法 描述
void clear() 用于清空Hashtable。
Object clone() 返回Hashtable的浅表副本。
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 用于计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值关联(或已映射为null),则使用给定的映射函数计算它的值,除非为null,否则将其输入到Map中。
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定键的值存在且非空,则用于给定键及其当前映射值的情况下计算新Map。
Enumeration elements() 返回Hashtable中值的枚举。
Set<Map.Entry<K,V>> entrySet() 返回Map中包含所有Entry的Set集合。
boolean equals(Object o) 用于将指定的Object与Map进行比较。
void forEach(BiConsumer<? super K,? super V> action) 对Map中的每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常为止。
V getOrDefault(Object key, V defaultValue) 根据key获取value对象,如果Map中不包含该key,则返回默认值defaultValue。
int hashCode() 返回Map的哈希码值
Enumeration<K> keys() 返回Hashtable中键的枚举。
Set<K> keySet() 返回Map的所有key的Set集合。
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的键尚未与值关联或与null关联,请将其与给定的非null值关联。
V put(K key, V value) 在Hashtable中插入具有指定键的指定值。
void putAll(Map<? extends K,? extends V> t) 用于将所有键值对从map复制到Hashtable。
V putIfAbsent(K key, V value) 如果指定的键尚未与值关联(或映射为null),则将其与给定值关联并返回null,否则返回当前值。
boolean remove(Object key, Object value) 从Hashtable中删除具有关联的指定键的指定值。
V replace(K key, V value) 将指定的值替换为指定的键。
boolean replace(K key, V oldValue, V newValue) 用指定键的新值替换旧值。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 用在该条目上调用给定函数的结果替换每个条目的值,直到处理完所有条目或该函数引发异常为止。
String toString() 返回Hashtable对象的字符串表示形式。
Collection values() 返回Map中包含value对象的Set集合。
boolean contains(Object value) 如果Hashtable中存在指定vaule对象,则此方法返回true,否则返回false。
boolean containsValue(Object value) 如果Hashtable中存在指定value对象,则此方法返回true,否则返回false。
boolean containsKey(Object key) 如果Hashtable中存在与指定的key,则此方法返回true,否则返回false。
boolean isEmpty() 如果Hashtable为空,则此方法返回true;否则,此方法返回true。如果包含至少一个key,则返回false。
protected void rehash() 用于增加Hashtable的大小并重新哈希其所有键。
V get(Object key) 根据key获取value对象。
V remove(Object key) 用于指定key的value对象。此方法返回与键关联的值。
int size() 返回Hashtable中的元素个数。

5 Java Hashtable的例子

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java Hashtable的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        Hashtable<Integer,String> hm=new Hashtable<Integer,String>();

        hm.put(100,"Eric");
        hm.put(102,"Jack");
        hm.put(101,"Rose");
        hm.put(103,"Mark");

        for(Map.Entry m:hm.entrySet()){
            System.out.println(m.getKey()+" "+m.getValue());
        }
    }
}

输出结果为:

103 Mark
102 Jack
101 Rose
100 Eric

6 Java Hashtable的例子:remove()

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java Hashtable的例子
 */
import java.util.*;

public class Demo {

    public static void main(String args[]) {
        Hashtable<Integer,String> map=new Hashtable<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Rose");
        map.put(103,"Lucas");
        System.out.println("remove前: "+ map);
        //删除key为102的数据
        map.remove(102);
        System.out.println("remove后: "+ map);
    }
}

输出结果为:

remove前: {103=Lucas, 102=Jack, 101=Rose, 100=Eric}
remove后: {103=Lucas, 101=Rose, 100=Eric}

7 Java Hashtable的例子:getOrDefault()

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java Hashtable的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        Hashtable<Integer,String> map=new Hashtable<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Rose");
        map.put(103,"Lucy");
        System.out.println(map.getOrDefault(101, "Not Found"));
        System.out.println(map.getOrDefault(105, "Not Found"));
    }
}

输出结果为:

Rose
Not Found

8 Java Hashtable的例子:putIfAbsent()

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java Hashtable的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        Hashtable<Integer,String> map=new Hashtable<Integer,String>();
        map.put(100,"Eric");
        map.put(102,"Jack");
        map.put(101,"Rose");
        map.put(103,"Lucy");
        System.out.println("初始化Hashtable: "+map);
        map.putIfAbsent(104,"Mark");
        System.out.println("更新后的Hashtable: "+map);
        map.putIfAbsent(101,"Lucas");
        System.out.println("更新后的Hashtable: "+map);
    }
}

输出结果为:

初始化Hashtable: {103=Lucy, 102=Jack, 101=Rose, 100=Eric}
更新后的Hashtable: {104=Mark, 103=Lucy, 102=Jack, 101=Rose, 100=Eric}
更新后的Hashtable: {104=Mark, 103=Lucy, 102=Jack, 101=Rose, 100=Eric}