java高频面试题,简洁明了

一、 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 浅拷贝

问题: 讲一讲深拷贝和浅拷

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值