- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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当前容量时(要添加的元素超出
您可能关注的文档
最近下载
- 护理事业近五年发展规划(2026-2030).pdf VIP
- 虚体医学丛书:医说解集——昆明新空间1025实验室.pdf VIP
- 跨学科实践活动10 调查我国航天科技领域中新型材料、新型能源的应用-九年级化学下册(人教版2024).pptx VIP
- 2024中国可再生能源大会:大型伞梯式陆基高空风力发电技术研究.docx
- 特发性与继发性三叉神经痛诊疗专家共识(2025版).pptx VIP
- 工艺管道施工方案.pdf VIP
- 《像山那样思考》课件.ppt VIP
- 工艺管道施工方案.doc VIP
- 分析石油地质勘探与储层评价方法.docx VIP
- DB11T 891-2012 居住建筑节能设计标准.pdf VIP
文档评论(0)