| hashMap |

LinkedHashMap

| | —- | —- | | image.png | image.png | | | 继承自HashMap, 底层额外维护了一个双向链表来维持数据有序. 可以通过设置accessOrder来实现FIFO(插入有序)或者LRU(访问有序)缓存. | | Map map = new HashMap();
map.put(“Rajib Sarma”,”100”);
map.put(“Rajib Sarma”,”200”);//The value “100” is replaced by “200”.
map.put(“Sazid Ahmed”,”200”); | |

2. hashtable

4种构造方法 image.png
put(): key重复value覆盖 image.png
put(): key不重复,key-value添加 image.png
(1)table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的。
(2)count是Hashtable的大小,它是Hashtable保存的键值对的数量。
(3)threshold是Hashtable的阈值,用于判断是否需要调整Hashtable的容量。threshold的值=”容量*加载因子”。
(4)loadFactor就是加载因子。
(5)modCount是用来实现fail-fast机制的

3. 比较

Hashtable和HashMap到底有哪些不同呢
(1)基类不同:HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

(2)null不同:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。

(3)线程安全:HashMap时单线程安全的,Hashtable是多线程安全的。

(4)遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

4. hashmap和hashset

HashMap HashSet
实现了Map接口 实现Set接口
存储键值对 仅存储对象
调用put()向map中添加元素 调用add()方法向Set中添加元素
HashMap使用键(Key)计算Hashcode HashSet使用成员对象来计算hashcode值,
对于两个对象来说hashcode可能相同,
所以equals()方法用来判断对象的相等性,
如果两个对象不同的话,那么返回false
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象 HashSet较HashMap来说比较慢
public class RunoobTest {
public static void main(String[] args) {
// 创建 HashMap 对象 Sites
HashMap Sites = new HashMap();
// 添加键值对
Sites.put(“one”, “Google”);
Sites.put(“two”, “Runoob”);
Sites.put(“three”, “Taobao”);
Sites.put(“four”, “Zhihu”);
System.out.println(Sites);
}
}
public class RunoobTest {
public static void main(String[] args) {
HashSet sites = new HashSet();
sites.add(“Google”);
sites.add(“Runoob”);
sites.add(“Taobao”);
sites.add(“Zhihu”);
sites.add(“Runoob”); // 重复的元素不会被添加
sites.remove(“Taobao”); // 删除元素,删除成功返回 true,否则为 false
System.out.println(sites);
}
}

5. hashMap hashtable hashSet

hashMap hashtable hashSet
元素类型 entry entry object
null 一个key为null, value无要求 key-value都不为null 无要求
重复元素 key可以重复,value不覆盖 key可以重复,value覆盖 唯一不重复