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是动态数组,依赖数组实现;LinkedList是双向链表,每个元素存前后节点引用。

核心区别在操作效率:

查改(get/set):ArrayList通过数组索引直接定位,O(1)效率;LinkedList要从表头/表尾遍历到目标位置,O(n),数据量越大差距越明显。

增删(add/remove,尤其是中间位置):ArrayList可能要移动后续元素(比如在中间删一个,后面所有元素往前挪),O(n);LinkedList只需改前后节点的引用,O(1)。

实际选择:

查多改少用ArrayList(比如商品列表展示,频繁分页查询);

增删频繁且多在首尾用LinkedList(比如实现队列、栈,或者订单待处理列表,频繁添加/移除头部元素)。

另外注意:ArrayList初始容量10(JDK1.8后延迟初始化,第一次add才分配),满了按1.5倍扩容;LinkedList不用考虑扩容,但每个元素要存前后引用,内存占用比ArrayList略高。

2.HashMap和Hashtable有什么不同?为什么现在很少用Hashtable了?

答案:

主要区别有3点:

线程安全:Hashtable是线程安全的(方法加了synchronized),HashMap线程不安全;

null值支持:HashMap的key和value都能存null(但key只能有一个null,value可多个);Hashtable的key和value都不能存null,存了会抛NullPointerException;

底层实现:JDK1.8后,HashMap当链表长度超过8会转红黑树,Hashtable一直是链表,没有树化优化,大数据量下查询效率低。

现在少用Hashtable的原因:

线程安全方案太笨重:synchronized锁的是整个Hashtable对象,多线程并发时会抢同一把锁,效率低;要线程安全的话,现在更推荐ConcurrentHashMap(JDK1.8用CAS+synchronized锁桶,并发效率高);

功能局限:不能存null,且没有树化优化,大数据量下性能差,不如HashMap灵活。

3.HashSet怎么保证元素不重复?它和TreeSet的区别是什么?

答案:

HashSet底层依赖HashMap实现的(把元素存在HashMap的key位置,value存一个固定的空对象),所以去重逻辑和HashMap的key去重一致:

当添加元素时,先算元素的hashCode,找对应的哈希桶;再用equals比较桶里的元素,若hashCode不同,直接存;若hashCode相同且equals返回true,就认为是重复元素,不存。

(这里要注意:如果自定义对象存HashSet,必须重写hashCode和equals,不然会用Object的默认方法,默认按内存地址比较,就算内容一样也会认为是不同元素)

HashSet和TreeSet的区别:

维度

HashSet

TreeSet

排序

不保证顺序(存的时候按哈希桶分布)

自然排序(默认)或定制排序(需传Comparator)

去重逻辑

依赖hashCode+equals

依赖compareTo(或compare),返回0就认为重复

底层实现

HashMap

TreeMap

性能

add/remove查O(1)

查改删O(logn)(红黑树结构)

适用场景

只需去重,不关心顺序

去重且需要排序(比如按价格排商品、按时间排日志)

4.HashMap在JDK1.8做了哪些优化?为什么要树化?

答案:

JDK1.8对HashMap的核心优化有3点:

底层结构:从“数组+链表”改成“数组+链表+红黑树”,当链表长度超过8(且数组长度≥64)时,链表转红黑树;当树节点数少于6时,再转回链表;

哈希算法:简化了hash计算,原来要多次异或和右移,1.8里直接用key的hashCode异或其高16位((h=key.hashCode())^(h16)),减少哈希冲突;

扩容机制:原来扩容时,链表节点会逆序(容易导致多线程下死循环),1.8改用尾插法,保持链表顺序,解决死循环问题(但HashMap仍线程不安全,只是避免了死循环)。

树化的原因:

链表查询是O(n),当

文档评论(0)

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

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

1亿VIP精品文档

相关文档