云计算百科
云计算领域专业知识百科平台

《面试问题总结3》

18.HashMap底层原理是什么?如何查找索引?

数组+链表+红黑树;

HashMap的索引:(n-1)&hash。(n是数组长度;数组长度必须为2^n);

19.影响HashMap容量的参数是什么?

两个参数是数组容量和加载因子。

数组容量设置过大时,会导致内存占用过多。

加载因子设置过小时,数组容量使用率较低,频繁扩容,导致性能下降;加载因子设置过大时,哈希冲突概率提高;默认加载因子是0.75。

20.为什么要用链表以及红黑树的优势是什么?

HashMap用链表解决哈希冲突;红黑树的优势是解决搜索性能下降,当链表过长时,链表会转换成红黑树(平衡二叉树,可以进行二分查找,提供查找效率)

21.ThreadLocal是什么?它的底层实现原理是什么?

ThreadLocal是线程局部变量,用于在线程内部保存数据。由于在ThreadLocal中保存的数据仅属于当前线程,所以该变量相对于其他线程而言是隔离的,也就是说改变量是当前线程独有的变量。     底层实现原理是哈希表。

22.GC如何判断是否需要回收?

(1)引用计数算法:

在对对象内部,添加并维护一个引用计数器。每当有地方引用它的时候,计数器就+1;

每当有一个地方引用失效的时候,计数器就-1;

每当该计数器的值为0时,那么该对象就是可被GC回收的垃圾对象。

(2).可达性分析算法:

通过定义了一系列"GC Roots"的跟对象作为起始节点集,从GC Roots开始,根据引用关系往下进行搜索,查找的路径我们把它称为"引用链"。当一个对象到GC Roots之间没有任何引用链相连时(对象与GC Roots之间并不可达),那么该对象就是可以被GC Roots回收的对象。(可达性算法也是被JVM默认使用的垃圾寻找算法)。

23.volatile关键字的作用是什么?底层如何实现?

volatile是JAVA中的一个轻量级同步关键字,主要用于修饰变量。它的核心作用是保证多线程环境下变量的可见性和禁止指令重排,但不保证原子性。

volatile的可见性和禁止指令重排特性,依靠JAVA内存模型中的内存屏障(Memory Barrier)实现,内存屏障是一组CPU指令。

24.垃圾收集器的基础算法是什么?

(1)标记-清除算法:通过遍历所有的GC Roots标记存活对象;回收堆区中没有标记的垃圾对象。

存在的问题:执行效率不稳定和内存空间碎片化。

(2)复制算法:算法将内存分为大小相同的两块,每次使用其中的一块,当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把已使用的空间一次清理掉。

存在的问题:对象存活率越高,需要进行较多的内存间复制,效率降低;浪费过多的内存,使现有的可用空间变为原先的一半。

该算法适用于仅需要复制少数存活对象的场景。

(3)标记-整理算法:通过遍历所有的GC Roots标记存活对象;让所有存活的对象向内存空间一端移动,然后直接清理边界以外的内存。不会留下大量的内存碎片。

存在的问题:整理过程中,需要在堆区移动整理对象并修改内存地址;停顿时间过长

 

 

 

赞(0)
未经允许不得转载:网硕互联帮助中心 » 《面试问题总结3》
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!