标签:read 线程 wirte math 运算 单线程 集合框架 打破 之间
常用的数学运算
自动拆箱装箱
JDK 1.7 数组+链表
JDK 1.8 hash表 = 数组+链表+红黑树
为什么链表长度在大于8的时候变成红黑树?
答:如果链表的长度没有达到这个长度的话,因为红黑树它自身的这种维护,插入的这种维护的开销也是非常大的,因为每次去插入一个元素的时候,很有可能会破坏掉它的平衡。也就是说hashmap的put操作非常多的时候,极有可能会影响插入的性能,因为插入一个元素的话,即有可能会打破它原有的平衡,那么每时每刻它都需要在恢复平衡(也就是红黑树的再平衡,需要左旋右旋,以及重新着色),就非常影响性能。
为什么数组的长度必须是2的指数次幂?
解释:Hashmap为了实现存取高效,要尽量减少碰撞,就是要尽量做到:把数据分配均匀,保证每个链表长度大致相同,我们就需要一个算法来实现;将存入的数据保存到那个链表中的算法;而这个算法实际就是取模:hash%length
? 但是,大家都知道这种运算不如位移运算快。因此,源码中做了优化 hash&(length - 1) 也就是说hash%length = hash&(length - 1)
那为什么是2的n次方呢?
因为2的n次方实际就是1后面n个0,而2的n次方-1,实际就是n个1
例如:长度为8时候,3&(8-1)=3 2&(8-1)=2 不同位置上,不碰撞。而长度是5的时候 3&(5-1)=0 2&(5-1)=0 都在0上,出现了碰撞。所以保证容积是2的n次方,是为了保证再做(length-1)的时候,每个位都能&1,也就是和1.....1111进行与运算。
0.75??
Serializable 接口
transient 关键字 (透明的 某个参数不需要序列化 )
标签:read 线程 wirte math 运算 单线程 集合框架 打破 之间
原文地址:https://www.cnblogs.com/ls-summer/p/14045589.html