Java 集合面试题总结(超详细版)
Java 集合是Java 面试中出现频率最高的内容之一。无论是初级还是高级 Java 开发岗位集合相关问题几乎是必问的。常见问题包括Java 集合体系结构List、Set、Map 的区别ArrayList 和 LinkedList 的区别HashMap 的底层实现HashMap 为什么是线程不安全HashMap 和 Hashtable 的区别HashSet 为什么不允许重复ConcurrentHashMap 原理本文将系统总结Java 集合高频面试题。一、Java 集合体系结构Java 集合主要分为两大类CollectionMapAI写代码java运行1 Collection 体系Collection 用于存储单个元素。主要分为Collection├── List有序可重复│ ├── ArrayList│ ├── LinkedList│ └── Vector│└── Set无序不可重复├── HashSet├── LinkedHashSet└── TreeSetAI写代码java运行特点集合特点List有序可重复Set无序不可重复篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho2 Map 体系Map 用于存储键值对key-value。Map├── HashMap├── LinkedHashMap├── TreeMap├── Hashtable└── ConcurrentHashMapAI写代码特点集合特点HashMap无序LinkedHashMap有序TreeMap排序Hashtable线程安全ConcurrentHashMap高并发二、List 集合List 集合特点有序可重复可以通过索引访问常见实现类ArrayListLinkedListVector三、ArrayList 面试题1 ArrayList 的底层数据结构ArrayList 底层是动态数组。transient Object[] elementData;AI写代码java运行特点查询快插入慢删除慢原因数组需要移动元素。2 ArrayList 扩容机制默认容量10AI写代码当数组不够时扩容为原容量 原容量 / 2AI写代码例如10 → 15 → 22 → 33AI写代码源码逻辑newCapacity oldCapacity (oldCapacity 1);AI写代码java运行优点减少扩容次数提高效率。3 ArrayList 为什么线程不安全因为没有加锁。例如两个线程同时添加元素sizeAI写代码可能会导致数据覆盖数组越界解决方式1️⃣ 使用Collections.synchronizedListList list Collections.synchronizedList(new ArrayList());AI写代码java运行2️⃣ 使用CopyOnWriteArrayList四、LinkedList 面试题1 LinkedList 底层结构LinkedList 底层是双向链表。结构prev ← node → nextAI写代码java运行特点插入快删除快查询慢2 LinkedList 为什么插入快因为不需要移动元素。只需要修改指针node.next newNodenewNode.prev nodeAI写代码java运行时间复杂度O(1)AI写代码五、ArrayList 和 LinkedList 区别对比ArrayListLinkedList数据结构数组双向链表查询快慢插入慢快删除慢快内存少多总结查询多 → ArrayList插入删除多 → LinkedList六、Set 集合Set 的特点不允许重复无索引常见实现HashSetLinkedHashSetTreeSet篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho七、HashSet 面试题1 HashSet 为什么不能存重复元素因为底层使用HashMap。源码private transient HashMapE,Object map;AI写代码java运行存储结构key 元素value 固定对象AI写代码java运行当 key 相同就不会再添加。2 HashSet 判断重复的过程步骤1️⃣ 计算 hashcodehash key.hashCode()AI写代码java运行2️⃣ 找到数组位置index hash % lengthAI写代码java运行3️⃣ 比较 equals()如果hashCode 相同equals 为 trueAI写代码则认为是重复元素。八、HashMap 面试题重点HashMap 是Java 面试必问。1 HashMap 底层结构JDK8JDK8 使用数组 链表 红黑树AI写代码结构数组↓链表↓红黑树AI写代码当链表长度 8AI写代码就会转换成红黑树AI写代码这样可以提高查询效率。2 HashMap 默认容量默认容量16AI写代码负载因子0.75AI写代码扩容条件容量 × 负载因子AI写代码例如16 × 0.75 12AI写代码当元素超过12时扩容。3 HashMap 扩容机制扩容容量 × 2AI写代码例如16 → 32 → 64AI写代码扩容时会进行rehash重新计算位置AI写代码4 HashMap 为什么线程不安全因为多个线程同时操作可能导致数据覆盖死循环数据丢失JDK7 中甚至可能出现CPU 100%AI写代码5 HashMap 和 Hashtable 区别对比HashMapHashtable线程安全不安全安全null可以不可以性能高低出现时间JDK1.2JDK1.0Hashtable 使用synchronizedAI写代码所以效率较低。九、ConcurrentHashMap 面试题ConcurrentHashMap 是线程安全的 HashMap特点高并发高性能JDK7 实现采用Segment 分段锁AI写代码结构Segment[]↓HashEntry[]AI写代码不同 Segment 可以同时操作。JDK8 实现JDK8 使用CAS synchronizedAI写代码锁粒度更小。性能更高。十、TreeMap 面试题TreeMap 底层是红黑树AI写代码特点自动排序key 不能为 null排序方式1️⃣ 自然排序2️⃣ Comparator示例TreeMapInteger,String map new TreeMap();AI写代码java运行篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho十一、Java 集合遍历方式常见遍历方式1 for 循环for(int i0;ilist.size();i){System.out.println(list.get(i));}AI写代码java运行2 增强 forfor(String s : list){System.out.println(s);}AI写代码java运行3 IteratorIterator it list.iterator();while(it.hasNext()){System.out.println(it.next());}AI写代码java运行十二、fail-fast 机制很多集合有fail-fast 机制。当集合被修改时会抛出异常ConcurrentModificationExceptionAI写代码例如for(String s : list){list.remove(s);}AI写代码java运行解决方法使用Iterator.remove()AI写代码java运行十三、Java 集合高频面试题总结面试官最喜欢问1️⃣ Java 集合体系结构2️⃣ ArrayList 和 LinkedList 区别3️⃣ ArrayList 扩容机制4️⃣ HashMap 底层结构5️⃣ HashMap 为什么线程不安全6️⃣ HashMap 扩容机制7️⃣ HashMap 为什么长度是 2 的幂8️⃣ HashSet 为什么不重复9️⃣ ConcurrentHashMap 原理 fail-fast 机制