当前位置: 首页 > web >正文

Java集合复习题目

White graces:个人主页

🐹今日诗词:开帘顿觉春风暖,满纸淋漓白云声🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

❓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

特性HashSetTreeSet
底层结构哈希表(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()

答: 将上面的几种情况答出来即可

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

http://www.xdnf.cn/news/2242.html

相关文章:

  • 【matlab】绘制maxENT模型的ROC曲线和omission curve
  • 基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装
  • 如何监控和分析MySQL数据库的性能?
  • 指针遍历数组
  • 如何控制DeepSeek的输出内容之AI时代的流量入口GEO
  • JavaScript基础-运算符的分类
  • HiSpark Studio如何使用Trae(Marscode)插件
  • SpringBoot 常用注解通俗解释
  • puppeteer注入浏览器指纹过CDP
  • linux blueZ 第五篇:高阶优化与性能调优——蓝牙吞吐、延迟与功耗全攻略
  • 详解 Network.framework:iOS 网络开发的新基石
  • Spring进阶篇
  • Java面试高频问题(29-30)
  • 解释PyTorch中的广播机制
  • 如何在 Ubuntu 22.04|20.04|18.04 上安装 PostGIS
  • Docker 学习入门篇:镜像构建、推送与私有仓库搭建全攻略
  • JAVA JVM面试题
  • MQ消息的不可靠性发生情况与解决方案
  • Goland终端PowerShell命令失效
  • YOLOv5修改检测框颜色,粗细,标签大小,标签名称
  • 提示词的神奇魔力——如何通过它改变AI的输出
  • 7.Geometric Intersection: Interval
  • [实战] 卡尔曼滤波:原理、推导与卫星导航应用仿真(完整代码)
  • 若干查找算法
  • Vue3 组件通信与插槽
  • 未雨绸缪:应对软件开发变更的生存之道
  • 23种设计模式-行为型模式之观察者模式(Java版本)
  • 理想星环OS选择NuttX作为MCU侧OS的核心原因分析​
  • 树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率
  • ASP.NET CORE部署IIS的三种方式