一、 Java 基础 (必考)
1. HashMap 的原理
问题: 说一下HashMap的实现原理,扩容机制,1.7和1.8的区别?
回答要点:
-
结构:数组 + 链表(1.7) / 数组 + 链表 + 红黑树(1.8)。通过key的hashcode经过扰动函数(高16位异或低16位)得到hash值,然后
(n-1) & hash确定数组下标。 -
put流程:计算hash -> 找数组下标 -> 如果该位置为空,直接插入 -> 如果不为空,遍历链表/树(比较hash和key)-> 如果key存在,覆盖value;如果不存在,插入到链表尾部(1.7头插法,1.8尾插法)。
-
扩容:默认初始容量16,负载因子0.75。当
size > capacity * loadFactor时,容量扩为原来的2倍。扩容后需要rehash,1.8优化了rehash过程,元素的新位置要么是原位置,要么是原位置 + oldCap。 -
区别:
-
1.7:头插法(多线程下可能造成死循环)、数组+链表
-
1.8:尾插法、数组+链表+红黑树(链表长度>8且数组长度>=64时转树)、优化hash算法和扩容机制。
-
2. ArrayList 和 LinkedList 的区别
问题: ArrayList和LinkedList有什么区别?分别在什么场景下使用?
回答要点:
-
底层结构:
-
ArrayList:基于动态数组。 -
LinkedList:基于双向链表。
-
-
操作效率:
-
随机访问 (get/set):
ArrayList是O(1),LinkedList是O(n)。 -
头部插入/删除:
ArrayList是O(n)(需要移动元素),LinkedList是O(1)。 -
尾部插入/删除:两者都是O(1)(ArrayList摊销时间)。
-
-
内存占用:
ArrayList更节省空间(仅存储数据),LinkedList每个节点需要额外空间存储前后节点的引用。 -
使用场景:
-
ArrayList:查询多,增删少的场景(90%以上的场景)。 -
LinkedList:频繁在头部或中间进行增删,而查询较少的场景。
-
3. 深拷贝 vs 浅拷贝
问题: 讲一讲深拷贝和浅拷

最低0.47元/天 解锁文章
2002

被折叠的 条评论
为什么被折叠?



