Java面试总结

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()比较的次数

请登录后发表评论

    没有回复内容