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标记存活对象;让所有存活的对象向内存空间一端移动,然后直接清理边界以外的内存。不会留下大量的内存碎片。
存在的问题:整理过程中,需要在堆区移动整理对象并修改内存地址;停顿时间过长
网硕互联帮助中心




评论前必须登录!
注册