Java集合复习题目

🐹今日诗词:开帘顿觉春风暖,满纸淋漓白云声🐹
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
目录
❓1. 你知道 List 是什么类型的结构?是类?接口?抽象类?
❓2. 你知道 List 里可以放 null 吗?重复元素可以吗?顺序是固定的吗?
❓3. 你用过哪些 List 的实现类?除了 ArrayList 和 LinkedList,你还见过什么别的?
❓1. 你觉得 ArrayList 的底层是数组吗?能动态变大吗?
❓2. 你觉得 LinkedList 是单向链表还是双向链表?为什么?
❓3. 你知道 ArrayList 插入一个元素到中间(比如第5个位置)要做什么操作吗?
❓1. 如果你想往 ArrayList 头部频繁插入元素,会发生什么?
❓2. LinkedList 中,从头删除一个元素(removeFirst())的时间复杂度是多少?为什么?
❓理解题 1:
你觉得 `list.sort(...)` 是返回新列表吗?还是在原列表上排序?
🚨 如果你希望返回一个“排序后新列表”怎么办?
你知道 removeIf() 是做什么的吗?能写个例子描述一下它的用法吗?
🥊 总结对比:HashSet vs TreeSet
你认为如果两个对象的 hashCode() 相同,但 equals() 方法返回 false,会发生什么情况?
📦 初始结构:
🚀 JDK 1.8 之后:
👉 为什么建议重写 equals() 的同时,也重写 hashCode()?
美图分享
❓1. 你知道 List 是什么类型的结构?是类?接口?抽象类?
ArrayList
→ 用 数组 来实现List
LinkedList
→ 用 链表 来实现List
- List 是一个接口(Interface)
❓2. 你知道 List 里可以放 null 吗?重复元素可以吗?顺序是固定的吗?
✅ 1. null 元素:可以放null
List
是允许包含null
元素的✅ 2. 重复元素:可以重复
List
是允许重复元素的。
List
允许元素重复出现,这与Set
不同,后者是不允许重复的。✅ 3. 顺序:固定的
List
是有序的,它会保留元素的插入顺序。所以顺序是固定的。
❓3. 你用过哪些 List 的实现类?除了 ArrayList 和 LinkedList,你还见过什么别的?
实现类 线程安全 结构类型 推荐场景 ArrayList ❌ 数组 普通使用,随机访问多 LinkedList ❌ 双向链表 插入删除多,栈/队列场景 Vector ✅ 数组 老代码兼容,不推荐 Stack ✅ 数组(继承 Vector) 栈操作,不推荐 CopyOnWriteArrayList ✅ 数组(写时复制) 并发读多写少的场景
❓1. 你觉得 ArrayList
的底层是数组吗?能动态变大吗?
- ✅ ArrayList 是用数组实现的
- ✅ 插入元素会检查容量
- ✅ 容量不够时,以 1.5 倍扩容
- ✅ 扩容很贵(要复制整个数组)
- ✅ 可以预设容量来避免性能问题
❓2. 你觉得 LinkedList
是单向链表还是双向链表?为什么?
- ✅ LinkedList 是双向链表
- ✅ 每个节点知道前后两个元素
- ✅ 插入 / 删除很快,随机访问很慢
- ✅ 不存在扩容问题,但占用内存多一些
❓3. 你知道 ArrayList
插入一个元素到中间(比如第5个位置)要做什么操作吗?
🧩 步骤 1:检查容量是否足够
🧩 步骤 2:从尾部往前移动元素,空出插入位置
🧩 步骤 3:在空出来的位置插入元素
❓1. 如果你想往 ArrayList 头部频繁插入元素,会发生什么?
(例如一直做
add(0, x)
)🚨 成本 1:可能触发扩容(O(n))
🚨 成本 2:每次插入都要移动所有元素(O(n))
❓2. LinkedList
中,从头删除一个元素(removeFirst()
)的时间复杂度是多少?为什么?
O(1), 因为是链表结构, 头结点记录的下一个节点的位置, 直接更新头结点位置即可
❓理解题 1:
class Person {String name;Person(String name) { this.name = name; } } List<Person> list = new ArrayList<>(); list.add(new Person("张三"));System.out.println(list.contains(new Person("张三"))); // 打印什么?
false
因为:
new Person("张三")
两个对象的name
都是"张三"
,但它们 创建了两个不同的对象,虽然是两个不同的内存地址名字一样,但引用不同** -对象**
你觉得 `list.sort(...)` 是返回新列表吗?还是在原列表上排序?
list.sort(...)
是在原来的列表上排序,不返回新列表。
list.sort(...)
是原地排序(in-place)- 排完之后,原来的
list
顺序就变了- 它的底层是调用
Arrays.sort()
(对于ArrayList
)
🚨 如果你希望返回一个“排序后新列表”怎么办?
List<String> sorted = list.stream().sorted().collect(Collectors.toList());
- 通过
stream()
把 list 转成流数据(Stream)- 然后用
sorted()
对流中的元素排序- 最后用
collect(Collectors.toList())
把排序后的流重新收集成一个新的 List
你知道 removeIf()
是做什么的吗?能写个例子描述一下它的用法吗?
这是
List
和其他集合(如Set
)的一个方法,用来:根据条件删除集合中满足条件的元素
语法: list.removeIf(元素 -> 条件)
List<String> list = new ArrayList<>(List.of("apple", "banana", "apricot", "cherry"));// 删除所有以 "a" 开头的字符串 list.removeIf(s -> s.startsWith("a"));System.out.println(list); // [banana, cherry]
解释:
s -> s.startsWith("a")
是一个Lambda表达式,意思是“只要字符串以a
开头,就删掉”removeIf()
会遍历整个 list,遇到满足这个条件的元素就删掉- 最后剩下的就是不满足这个条件的元素了
总结:
removeIf()
是用来按条件批量删除元素的- 参数是一个返回布尔值的函数
- 非常适合用于“筛除”一类不需要的数据
🥊 总结对比:HashSet vs TreeSet
特性 HashSet TreeSet 底层结构 哈希表(HashMap) 红黑树(平衡二叉树) 是否排序 ❌ 否 ✅ 自动排序(按元素大小) 插入/查找/删除 O(1)(理想),O(log n)(红黑树) O(log n) 允许 null 吗? ✅ 可以一个 null ✅ 可以一个 null(但要小心) 是否线程安全 ❌ 否 ❌ 否
HashSet 快,不排序;TreeSet 排序,慢点也优雅。
你认为如果两个对象的 hashCode()
相同,但 equals()
方法返回 false
,会发生什么情况?
发生了哈希冲突
两个不同的值,如果经过哈希算法计算后得到相同的哈希值,就会发生哈希冲突。
如果两个对象
hashCode()
相同,equals()
也相同,HashMap 会怎么处理?答: HashMap 会判断 key 已经存在,于是用新 value 覆盖旧的 value。也就是更新,而不是新增。
如果两个对象
hashCode()
相同,但equals()
不相同,HashMap 会怎么处理?答: HashMap 判断“不是同一个 key”,于是把这个 entry 加到该桶的链表末尾(或者红黑树里)。这就叫哈希冲突但内容不相等。
如果一个类没有重写
hashCode()
和equals()
,可能会出现什么问题?答: 如果不重写 equals 和 hashCode,equals方法的结果相同但hashCode的不相同
会导致内容相同的对象被当成不同的 key,产生重复 key 的 Bug。
HashMap 发生哈希冲突后,最开始是用什么结构来存储冲突元素的?JDK1.8 之后又加了什么新结构?
答:
📦 初始结构:
- 数组 + 链表
- 每个桶(数组元素)指向一个链表,存储发生冲突的 entry
🚀 JDK 1.8 之后:
- 当链表长度超过 8 且数组长度 ≥ 64 时
- HashMap 会把链表转化为红黑树,提高查找效率
这样查找时间复杂度从 O(n) 提高到 O(log n)
👉 为什么建议重写
equals()
的同时,也重写hashCode()
?答: 将上面的几种情况答出来即可
美图分享
✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄
⭐️点赞收藏加关注,学习知识不迷路⭐️
🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️