Hashmap
Hashmap是数组和链表的结合体,当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。继承自父类AbstractMap
public class HashMap extends AbstractMap implements Map
创建
// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites);
增删改查搜
//使用 get(key) 方法来获取 key 对应的 value
System.out.println(Sites.get(3));
//使用 remove(key) 方法来删除 key 对应的键值对(key-value)
Sites.remove(4);
//删除所有键值对(key-value)可以使用 clear 方法
Sites.clear();
//计算 HashMap 中的元素数量可以使用 size() 方法
int n = Sites.size();
//使用containsKey查询是否存在key
boolean containsKey(java.lang.Object))
//使用containsValue查询是否存在value
boolean containsValue(java.lang.Object))
//判断Map是否为空
boolean isEmpty()
//返回映射中包含的Key的集合
Sites.keySet()
//返回映射中包含的Value的集合
Sites.values();
//返回映射的集合
Sites.entrySet()
遍历
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
// 输出 key 和 value
for (Integer i : Sites.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
//使用Iterator遍历Entry
Iterator iter = Sites.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
//使用Iterator遍历key
Iterator iter = balance.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = balance.get(key);
System.out.println(key);
}
Hashtable
Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。这意味着Hashtable线程安全,可以在多个线程之间共享,但是HashMap如果没有适当的同步,就不能在多个线程之间共享在多线程并发的环境下,需要自己加同步处理。
继承自类Dictionary
public class Hashtable extends Dictionary implements Map
创建
//默认构造方法
Hashtable()
//指定大小
Hashtable(int size)
//第三个构造方法创建了一个指定大小的哈希表,并且通过fillRatio指定填充比例。填充比例必须介于0.0和1.0之间,它决定了哈希表在重新调整大小之前的充满程度:
Hashtable(int size,float fillRatio)
//创建了一个以M中元素为初始化元素的哈希表。哈希表的容量被设置为M的两倍。
Hashtable(Map m)
方法
HashTable多实现了几个方法
//测试此映射表中是否存在与指定值关联的键。
boolean contains(Object value)
//返回此哈希表中的值的枚举
Enumeration elements( )
//返回此哈希表中的键的枚举
Enumeration keys( )
区别
- Hashtable线程安全,而HashMap不是线程安全
- HashMap的效率会比Hashtable要好很多
- 初始容量大小和每次扩充容量大小的不同。Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
- 计算hash值的方法不同。为了得到元素的位置,首先需要根据元素的key计算出一个hash值,然后再用这个hash值来计算得到最终的位置。
Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。HashMap的效率虽然提高了,但是hash冲突却也增加了。 - 对外提供的接口不同。Hashtable比HashMap多提供了elments() 和contains() 两个方法。
- 对null key 和null value的支持不同.Hashtable既不支持null key也不支持null value。Hashtable的put()方法的注释中有说明。