1 HashMap
Hashmap的底层数据结构为散列表,底层实现结构为数组和链表,当一个key-val对要插入时,会根据key计算出hashcode,然后映射到数组的某个位置。如果数组的位置已经被占用且发生了冲突。则通过链表地址发来解决这个冲突。
插入过程
put(key,val),对key进行HASH得到hashcode,通过hashcode得到位置如果未占用,直接将这个key-val存放。
如果发生了冲突,则通过链地址法来解决冲突,从这个位置关联一个链表,在链表的节点上(bucket)上讲key-val存放其中。
取值过程
get(key),对key进行HASH得到hashcode,通过hashcode在数组上找到这个位置,如果这个
位置上只有一个entry对(即没有关联链表),则直接取出即可。
如果这个位置上有多个entry对,即有关联一个链表,则对这个链表进行遍历,如果entry对的
key等于要查询的key,则将entry对取出。
与HashTable的区别
Hashtable的所有方法都加了synchronized是线程安全的,HashMap是非线程安全的
Hashtable不可以设置Null的key,而HashMap是可以设置为Null的key
单线程时Hashtable速度较慢
通过HashMap达到线程安全目的
我们也可以让HashMap同步
Map m = Collections.synchronizeMap(hashMap);
这样是通过一个互斥的对象锁,来达到线程同步的目的
但这样的实现在并发场景上效率太低
后来concurrent包下的ConcurrentHashMap,通过在数据结构上真正的实现了对高并发的支持
2 TreeMap
- 线程不安全
- 内部红黑树实现
3 LinkedHashMap
- 内部的entry< k,v >除了保存当前元素的引入,还保存前一个、后一个元素的引用
- 是从HashMap继承
- 对插入顺序是有序的
- 可实现LRU算法
- 线程不安全