- 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集合高频面试题及实战答案
一、基础概念类
问:Java集合框架的核心接口有哪些?各自的核心特点是什么?
答:核心是Collection和Map两大顶层接口。Collection下面分List、Set、Queue:List是有序可重复(比如ArrayList、LinkedList),支持索引访问;Set是无序不可重复(比如HashSet、TreeSet),去重靠equals和hashCode;Queue是队列结构,遵循FIFO(比如LinkedList、PriorityQueue)。Map是键值对映射(比如HashMap、TreeMap),键唯一,值可重复,不能直接遍历,得通过keySet()或entrySet()。
问:Collection和Collections有什么区别?
答:完全不是一回事。Collection是接口,定义了集合的基本操作(add、remove、size这些);Collections是工具类,提供静态方法帮你操作集合,比如排序(sort)、查找(binarySearch)、线程安全包装(synchronizedList)、空集合创建(emptyList)这些实用功能。
二、底层原理类
问:ArrayList和LinkedList的底层实现、优缺点及适用场景?
答:ArrayList底层是动态数组,初始化容量10,扩容时按1.5倍(oldCapacity+(oldCapacity1))扩容,拷贝数组到新空间。优点是随机访问快(get(intindex)直接下标),缺点是插入/删除中间元素慢(要移动数组元素)。
LinkedList底层是双向链表,每个节点存前驱、后继和数据。优点是插入/删除快(只需改指针),缺点是随机访问慢(得从头/尾遍历)。
适用场景:查多改少用ArrayList,改多查少用LinkedList;另外ArrayList遍历用for循环,LinkedList用迭代器或增强for更高效。
问:HashMap的底层实现(JDK1.8),为什么用红黑树?负载因子的作用?
答:JDK1.8里HashMap是“数组+链表+红黑树”结构。数组是哈希桶,每个元素是Node节点,链表长度超过8且数组容量≥64时,会转成红黑树(查询时间复杂度从O(n)降到O(logn));如果数组容量不够64,会先扩容而不是转树。
负载因子默认0.75,作用是平衡“空间”和“时间”:负载因子太大,数组利用率高,但链表/红黑树容易变长,查询慢;太小,数组频繁扩容,浪费空间。比如容量16,当元素达到16*0.75=12时,就会扩容到32。
问:HashSet的底层是怎么实现的?它怎么保证元素不重复?
答:HashSet底层就是HashMap,它把要存的元素作为HashMap的key,value是一个固定的Object对象(PRESENT)。
保证不重复的逻辑和HashMap一致:添加元素时,先通过元素的hashCode()计算哈希值,找到数组对应的桶位,再通过equals()方法比较桶位里的元素(链表/红黑树节点)。如果hashCode不同,直接存;如果hashCode相同但equals不同,挂到链表/红黑树;如果hashCode和equals都相同,就替换原来的key(但value不变,所以看起来是“不重复”)。
三、使用坑点对比类
问:HashMap和ConcurrentHashMap的区别?为什么HashMap线程不安全?
答:主要区别在线程安全和性能。HashMap线程不安全,ConcurrentHashMap是线程安全的(JDK1.8用CAS+synchronized实现,比1.7的分段锁效率高)。
HashMap线程不安全的场景:比如多线程同时put,可能导致链表成环(扩容时转移节点),查询时死循环;或者多线程put同一个key,可能覆盖数据;还有size计算不准确。ConcurrentHashMap通过锁粒度控制(锁住单个桶位而非整个数组),既保证安全又提高并发效率,还支持原子操作(比如putIfAbsent)。
问:TreeMap和HashMap的区别?TreeMap的排序规则是什么?
答:底层实现不同:HashMap是数组+链表+红黑树,TreeMap是红黑树(基于红黑树的有序映射)。
核心区别是有序性:HashMap无序(插入顺序和遍历顺序不一致),TreeMap是有序的(默认按key
原创力文档


文档评论(0)