1.HashMap
1.8与1.7的区别
(1) 扩容因子默认为什么是0.75
如果扩容因子过高,空间利用率提高但是哈希冲突概率增加;如果扩容因子过低,会造成频繁扩容,哈希冲突概率降低,但是空间利用率变低。选择0.75是基于泊松分布,是时间和空间成本上寻求的一种折中选择
(2)为什么链表长度为8要转化为红黑树
首先和hashcode
碰撞次数的泊松分布有关,主要是为了寻找一种时间和空间的平衡。在负载因子0.75(HashMap默认)的情况下,单个hash
槽内元素个数为8的概率小于百万分之一,将7作为一个分水岭,等于7时不做转换,大于等于8才转红黑树,小于等于6才转链表。链表中元素个数为8时的概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据概率统计而选择的。红黑树中的TreeNode
是链表中的Node
所占空间的2倍,虽然红黑树的查找效率为$O(logN)$,要优于链表的$O(N)$,但是当链表长度比较小的时候,即使全部遍历,时间复杂度也不会太高。所以,要寻找一种时间和空间的平衡,即在链表长度达到一个阈值之后再转换为红黑树
2. 强引用、软引用、弱引用、虚引用的区别
-
强引用:如果一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足时,JVM 宁愿抛出OOM错误,使程序异常终止;
-
软引用:如果内存空间足够,垃圾回收器就不会回收它。如果内存空间不足了,就会回收这些对象的内存,只要垃圾回收器没有回收它,该对象就可以被程序使用
-
弱引用:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
-
虚引用:在任何时候都可能被垃圾回收器回收
3. ==
和 equals
区别
- ==:如果是基本数据类型,比较的是值,如果是引用数据类型,比较的是地址
equals
:继承自Object
类,具体实现时可以覆盖父类的实现。如果没有复写,则和 == 一样,比较地址;如果复写了则根据复写的判断方式
4.Object
类的 hashCode
方法的作用
hashCode
的哈希码主要作用是给散列表快速确定索引的,通过哈希码先判断对象是否有可能相同(因为相同的对象哈希码也一定相同),再去用 equals() 做进一步的比较,这样可以大大减少使用 equals()
比较的次数
没有回复内容