hashmap的一些总结

 

1. HashMap的底层是数组和链表jdk1.8之后加了红黑树。

HashSet的底层是HashMap, 其存储的对象在key 里面,

定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。     private static final Object PRESENT = new Object();  

 

HashMap的value 可以是 null, key 也可以 null.所以使用的是containKey来判断是非存在某个key,而不能通过get(key).

 

       初始容量, 加载因子。

      默认容量等于初始最大容量 * 加载因子。

     HashMap的内部数组的默认长度16, 会自动扩容

      存值的过程是:put(key,value):

  hashcode() 和 equals()来判断key, 如果存在则替换值,所以在便利的时候后者会覆盖前者(key相同的时候)。

index数组下标的计算方式:

length: HashMap的主干部分(数组tab)的长度

int index = hash() & length -1

tab[index]: Node对象放的位置。

 

HashMap不是线程安全的

HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

 

CocurrentHashMap对比HashMap在HashEnty前面加了Segment段   

当链表的长度达到一定值(默认为8)之后,会转换成红黑树的结构,如下图:

Hashmap在多线程写入会导致死循环

CocurrentHashMap通过分段锁的机制,实现了多线程写入时的线程安全

 

下图是链表的长度达到默认值8之后转为红黑树的过程:

 

currentHashMap 参考:https://blog.csdn.net/liuyuanq123/article/details/80283913

hashTable:

Hashtable实现了Map接口,具有同步的功能。

转载于:https://www.cnblogs.com/pro-wall-box/p/11154967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值