JAVA集合类实现原理简述-Part1 Map

1 HashMap

Hashmap的底层数据结构为散列表,底层实现结构为数组和链表,当一个key-val对要插入时,会根据key计算出hashcode,然后映射到数组的某个位置。如果数组的位置已经被占用且发生了冲突。则通过链表地址发来解决这个冲突。

插入过程

put(key,val),对key进行HASH得到hashcode,通过hashcode得到位置如果未占用,直接将这个key-val存放。

如果发生了冲突,则通过链地址法来解决冲突,从这个位置关联一个链表,在链表的节点上(bucket)上讲key-val存放其中。

取值过程

getkey),对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算法
  • 线程不安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值