Java数据结构高频面试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Java数据结构高频面试题及答案

1.说说ArrayList和LinkedList的核心区别,实际开发中怎么选?

答案:

核心区别在底层结构和操作效率:

底层:ArrayList是动态数组(基于Object[]),LinkedList是双向链表(实现了Deque接口);

效率:

查改:ArrayList支持随机访问(通过索引get(i)),时间复杂度O(1);LinkedList需遍历链表,O(n);

增删:ArrayList在尾部增删快(O(1)),但中间增删需移动数组元素(O(n));LinkedList只要拿到节点,中间增删仅改指针(O(1)),但需遍历找节点(O(n));

空间:ArrayList有数组扩容冗余,LinkedList每个节点存前后指针,空间开销更大。

实际选择:

若频繁查改(如数据展示、按索引取值),用ArrayList;

若频繁在中间增删(如队列、栈操作),用LinkedList(还能直接用offer/poll当队列);

注意:LinkedList虽增删“理论快”,但遍历找节点的耗时可能抵消优势,若能提前拿到节点(如迭代器遍历中操作)才真高效。

2.HashMap的底层实现原理是什么?JDK1.7和1.8有哪些关键差异?

答案:

底层是“数组+链表/红黑树”的哈希表结构,核心是通过哈希函数定位数据存储位置:

计算key的hash值:先调用key.hashCode(),再通过“扰动函数”(1.8是(h^(h16)))减少哈希冲突;

定位数组索引:(数组长度-1)hash(数组长度必须是2的幂,保证索引不越界);

存储数据:若索引处无元素直接存,有元素则判断key是否相同(equals),相同则覆盖值,不同则挂在链表后(拉链法解决冲突)。

JDK1.7vs1.8差异:

维度

JDK1.7

JDK1.8

结构

数组+链表

数组+链表+红黑树

红黑树触发

链表长度≥8且数组长度≥64

哈希计算

4次扰动(多次异或移位)

1次扰动(高16位异或低16位)

插入方式

头插法(易链表环)

尾插法(避免环)

扩容判断

先扩容再插入

先判断是否需要扩容再插入

3.ConcurrentHashMap为什么是线程安全的?JDK1.8做了哪些优化?

答案:

线程安全核心是“锁机制”,1.7和1.8实现不同:

JDK1.7:用“分段锁(Segment)”,每个Segment是一个小HashMap,锁只锁单个Segment,多个线程操作不同Segment时无竞争;但Segment数量固定(默认16),并发度有限,且底层仍用ReentrantLock加锁。

JDK1.8:移除Segment,改用“CAS+synchronized”组合锁:

无元素时,用CAS尝试插入节点,成功则无锁;

有元素时,用synchronized锁链表头/红黑树根节点,只锁当前冲突的链表/树,锁粒度更细;

此外,value用volatile修饰,保证读写可见性,get操作无锁(无需加锁就能读)。

优化点:锁粒度从“分段”缩到“节点”,并发度更高;去掉ReentrantLock,用synchronized(JVM优化后性能不弱),减少锁开销;支持红黑树,冲突多时查询效率更高。

4.红黑树的特性是什么?为什么HashMap要用红黑树而不是AVL树?

答案:

红黑树是“近似平衡”的二叉搜索树,特性:

每个节点非红即黑;

根节点是黑的;

叶子节点(NIL节点)是黑的;

红节点的两个子节点都是黑的(无连续红节点);

从任意节点到叶子节点,黑节点数量相同(黑高一致)。

选红黑树不选AVL树的原因:

AVL树是“严格平衡”(左右子树高度差≤1),插入/删除时需频繁旋转(最多4次),性能开销大;

红黑树是“近似平衡”,插入/删除最多旋转2次,开销小;

HashMap中链表转树的场景是“冲突多但不是极端多”,红黑树的平衡度足够(查询O(logn)),且旋转少,更适合频繁增删的场景;AVL树的严格平衡在HashMap中没必要,反而会拖慢增删效率。

5.ArrayList的扩容机制是怎样的?初始容量是多少?

答案:

扩容核心是“数组拷贝”,流程:

初始容量:JDK1.8中,ArrayList默认初始容量是0(空数组),第一次调用add()时才初始化容量为10;若创建时指定容量(如newArrayList(20)),则按指定值初始化。

扩容触发:当size+1当前容量时(要添加的元素超出

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档