26年2月杭州云智科技 Java开发工程师 一面

1. Java中HashMap的底层数据结构是什么?JDK 1.8之后有什么优化?

回答

:HashMap底层在JDK 1.7及之前采用数组+链表实现,JDK 1.8之后采用数组+链表+红黑树。当链表长度超过8且数组长度大于等于64时,链表会转换为红黑树,红黑树查询时间复杂度为O(log n),相比链表的O(n)有显著提升。同时还引入了容量扩容优化、插入操作优化(尾插法避免环形链表)等改进。

2. HashMap是线程安全的吗?如果要在多线程环境下使用,应该怎么做?

回答

:HashMap不是线程安全的。在多线程环境下,可以使用Collections.synchronizedMap()方法包装为线程安全的Map,或者使用ConcurrentHashMap。ConcurrentHashMap采用分段锁技术,JDK 1.8之后使用CAS+synchronized实现,锁的粒度更细,并发性能更好。

3. ArrayList和LinkedList的区别是什么?分别适用于什么场景?

回答

:ArrayList底层是动态数组,查询时间复杂度为O(1),但插入和删除需要移动元素,时间复杂度为O(n);LinkedList底层是双向链表,插入和删除时间复杂度为O(1),但查询需要遍历链表,时间复杂度为O(n)。ArrayList适用于频繁查询的场景,LinkedList适用于频繁插入删除的场景。

4. 讲讲JVM的内存模型,分为哪些区域?

回答

:JVM内存模型分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器是线程私有的,记录字节码行号;虚拟机栈是线程私有的,存储局部变量表、操作数栈等;本地方法栈与虚拟机栈类似,但为Native方法服务;堆是线程共享的,存储对象实例和数组;方法区是线程共享的,存储类信息、常量、静态变量等,JDK 1.8后改用元空间实现。

5. 哪些对象会被GC ROOT直接引用?

回答

:GC ROOT对象包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象、活跃线程的引用对象。这些对象不会被垃圾回收,它们引用的对象也不会被回收。

6. MySQL的索引

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务