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集合类高频面试题及答案

一、基础概念题

问:Java集合框架的核心接口有哪些?它们之间的关系是什么?

答:核心接口主要是Collection和Map两大顶层接口。Collection存储单值集合,子接口有List(有序可重复)、Set(无序不可重复)、Queue(队列,先进先出);Map存储键值对(key-value),核心实现类如HashMap、TreeMap等。注意:Map不是Collection的子接口,两者是平行关系,集合框架的工具类Collections提供了对这些集合的操作方法。

问:Collection和Collections的区别是什么?

答:完全是两个不同的东西。Collection是接口,定义了单值集合的通用操作规范(如add、remove、size等);Collections是工具类(含static方法),提供了排序、查找、同步化等集合操作工具,比如Collections.sort(list)排序、Collections.synchronizedList(list)实现线程安全集合。

问:List、Set、Map的核心特点对比?

答:

List:有序(插入顺序=遍历顺序)、可重复,支持索引访问(get(intindex)),代表类ArrayList、LinkedList;

Set:无序(HashSet无序,TreeSet按自然顺序排序)、不可重复(依赖equals()和hashCode()去重),无索引,代表类HashSet、TreeSet;

Map:键值对存储,key不可重复(同Set去重规则),value可重复,key无序(HashMap)或有序(TreeMap),代表类HashMap、TreeMap、HashTable。

二、核心实现类原理题

问:ArrayList和LinkedList的底层实现、优缺点及适用场景?

答:

ArrayList:底层是动态数组(初始容量10,扩容时默认扩容为原容量的1.5倍),实现RandomAccess接口,支持快速随机访问(get/set时间复杂度O(1));缺点是插入/删除中间元素时需要移动数组元素,时间复杂度O(n),且扩容会消耗内存(复制原数组元素)。

LinkedList:底层是双向链表(每个节点存储前驱、后继节点和数据),不支持随机访问(get需遍历链表,O(n));优点是插入/删除中间元素只需修改节点引用,O(1)时间,且无需扩容。

适用场景:频繁查改(get/set)用ArrayList;频繁增删(add/remove中间元素)用LinkedList。

问:HashMap的底层实现(JDK1.8之后)、扩容机制和线程安全问题?

答:

底层:数组+链表+红黑树。数组是哈希桶,每个元素是链表(解决哈希冲突),当链表长度超过8且数组容量=64时,链表转为红黑树(提升查询效率,红黑树查询O(logn),链表O(n));若数组容量64,会先扩容而非转树。

哈希计算:key的hashCode()经过扰动函数(减少哈希冲突)后,与数组长度-1做与运算,得到数组索引(确保索引在数组范围内)。

扩容机制:初始容量16,负载因子0.75(默认当元素个数容量*0.75时触发扩容),扩容后容量是原容量的2倍(保证数组长度是2的幂,方便与运算计算索引),扩容时会重新计算所有元素的哈希索引,迁移到新数组。

线程安全:HashMap线程不安全!多线程下可能出现链表环(扩容时)、数据覆盖(put相同key时)等问题,解决方式:用ConcurrentHashMap(推荐,高效线程安全)或Hashtable(低效,全表加锁)。

问:HashMap和HashSet的关系?HashSet如何保证元素不可重复?

答:HashSet底层依赖HashMap实现!HashSet的add方法本质是调用HashMap的put方法,将元素作为HashMap的key,value是一个固定的Object对象(PRESENT)。

去重原理:HashMap的key不可重复,所以HashSet元素不可重复。当添加元素时,先计算元素的hashCode()和equals(),若HashMap中已存在相同hashCode且equals为true的key,则add失败,否则添加成功。

结论:HashSet的去重依赖于元素的hashCode()和equals()方法,若自定义类作为HashSet

文档评论(0)

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

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

1亿VIP精品文档

相关文档