集合框架

共 78 题
#

1. ArrayDeque 与 LinkedList 作为队列的性能对比

A 两者头尾操作都是 O(1),但 ArrayDeque 数组布局更缓存友好、内存紧凑,通常性能更好 ✓ 正确答案
B ArrayDeque 允许 null
C 两者内存开销相同
D LinkedList 的数组实现更高效
#

2. ArrayList 的扩容机制、容量与 ensureCapacity 优化

A 扩容是 O(1)
B 扩容是每次 +1 个元素
C 扩容约为 1.5 倍并复制数组,均摊 O(1),批量前用初始容量/ensureCapacity 减少扩容 ✓ 正确答案
D ensureCapacity 会缩小容量
#

3. ArrayList 迭代过程中并发修改为何抛 ConcurrentModificationException,单线程下边遍历边 remove 怎样避免该异常

A 迭代中 list.remove 总是安全的
B CME 只在多线程才可能
C 结构修改使 modCount 变化,迭代器检测不一致抛 CME(fail-fast),单线程用 Iterator.remove 或 removeIf 安全遍历删除 ✓ 正确答案
D removeIf 也会抛 CME
#

4. ArrayList.subList 为何只是原列表视图,原列表发生结构修改后访问子列表会出现什么结果

A subList 是独立副本
B 子列表修改不影响原列表
C subList 共享底层数组,原列表结构修改后访问子列表会因 modCount 不一致抛 CME,需独立数据时复制 ✓ 正确答案
D subList 永不抛异常
#

5. Collections.synchronizedList 与 CopyOnWriteArrayList 的适用场景

A synchronizedList 全锁写便宜、迭代需加锁;CopyOnWriteArrayList 写时复制、读无锁迭代快照,适合读多写极少 ✓ 正确答案
B CopyOnWriteArrayList 写成本低
C synchronizedList 迭代是快照
D 两者读都需加锁
#

6. Collections.unmodifiableList 与 List.copyOf 在底层集合继续变化时,观察结果有何不同

A unmodifiableList 是只读视图(共享底层),List.copyOf 是独立不可变快照,底层变化后 copyOf 不受影响 ✓ 正确答案
B 两者都是独立副本
C unmodifiableList 会复制数据
D 两者都反映底层变化
#

7. Comparable 与 Comparator 的职责边界如何划分,自然排序与定制排序在 TreeSet/TreeMap 中如何影响去重与查找

A Comparable 是自然排序、Comparator 是定制排序,TreeSet/TreeMap 按比较器排序并据 compare 去重 ✓ 正确答案
B TreeSet 去重依据 equals
C TreeSet 用 hashCode 去重
D 比较器与 equals 不一致不影响查找
#

8. ConcurrentHashMap 在 JDK 21+ 对虚拟线程友好的协作机制与桶级别锁粒度的演化

A JDK 7 用桶级锁,JDK 8 用分段锁
B 锁粒度一直是全局锁
C 虚拟线程不适用于 CHM
D JDK 8 起用桶级 CAS+synchronized,粒度细并发高;JDK 21+ 虚拟线程下 synchronized 可挂起不阻塞载体,更友好 ✓ 正确答案
#

9. ConcurrentHashMap 的 mappingCount 与 size 在并发修改期间各有什么一致性和溢出差异

A size() 与 mappingCount() 都精确
B mappingCount() 只在单线程精确
C size() 返回 int 可能溢出,mappingCount() 返回 long 不溢出,两者并发期间都是近似值 ✓ 正确答案
D size() 永不溢出
#

10. ConcurrentHashMap 的 size 统计为何不精确

A size 在任意时刻都精确
B size 使用全局锁保证精确
C CHM 用无锁计数器(baseCount+CounterCell)换取并发,size 是近似值,精确计数需外部同步 ✓ 正确答案
D size 会阻塞并发写
#

11. ConcurrentHashMap 的实现原理(CAS + synchronized + 树化)

A 所有写入都用全局锁
B 树化后查找变慢
C 它用 JDK 7 的 Segment 分段锁
D 空桶用 CAS 无锁插入,非空桶用 synchronized 桶级锁,长链树化(红黑树)并协作扩容 ✓ 正确答案
#

12. ConcurrentHashMap 禁止 null 键值如何消除并发查找中的歧义,缺失值应怎样建模

A 禁止 null 消除"get 返回 null 是键不存在还是值即 null"的并发歧义,缺失值用 Optional/哨兵/默认值建模 ✓ 正确答案
B 禁止 null 是为了省内存
C CHM 允许 null 值
D get 返回 null 表示值恰好是 null
#

13. ConcurrentHashMap.computeIfAbsent 的映射函数为何应短小且无递归更新,阻塞时会影响哪些桶

A 映射函数可自由做 I/O
B 映射函数在桶锁内执行,应短小无递归更新,否则阻塞该桶或死锁,只影响被锁的单桶 ✓ 正确答案
C 映射函数可递归更新同一 CHM
D 映射函数影响所有桶
#

14. ConcurrentLinkedQueue 的无锁实现(CAS)

A 它用 synchronized 锁整个队列
B 用 volatile 头尾指针 + CAS 入队出队,无锁不阻塞、低延迟,但无界、size 为 O(n) ✓ 正确答案
C 它有界且阻塞
D 入队出队需要全局锁
#

15. ConcurrentSkipListMap 的弱一致迭代器能观察到哪些并发更新,为什么不抛 ConcurrentModificationException

A 它是 fail-fast 迭代器
B 它保证强一致
C 弱一致迭代器基于跳表结构安全遍历,可见部分并发更新但不保证强一致,不抛 CME ✓ 正确答案
D 并发更新会抛 CME
#

16. CopyOnWriteArrayList 执行 removeIf 或批量写入时会复制多少数据,适合怎样的读写比例

A 写操作只复制单元素
B 每次写(含 removeIf/批量)都复制整个数组,写成本 O(n),适合读多写极少的场景 ✓ 正确答案
C 写操作 O(1)
D 适合写频繁场景
#

17. CopyOnWriteArrayList 的迭代器为何提供快照语义,长时间持有迭代器会造成什么内存压力

A 迭代器持有的是最新数组
B 迭代器持有创建时的数组快照,写时复制新数组,长期持有迭代器会滞留旧数组造成内存压力 ✓ 正确答案
C 写操作不产生新数组
D 迭代器不引用数组
#

18. EnumSet 在枚举常量超过六十四个时如何改变内部表示,其位集合优势是否仍然存在

A 超过 64 改用 HashSet
B 超过 64 用 JumboEnumSet(long[] 位集),位集合优势(紧凑、位运算)仍保留 ✓ 正确答案
C 超过 64 后位集失效
D 超过 64 后操作变 O(n)
#

19. HashMap 在 JDK 17/21 中红黑树化阈值(8/64)与负载因子的演进及取舍

A 链表长度 >= 8 即树化,无需容量条件
B 树化需链表>=8 且数组>=64,负载因子 0.75 平衡时间/空间,避免过早树化 ✓ 正确答案
C 负载因子越大越省内存
D 树化阈值是 16/128
#

20. HashMap 在 JDK 8/17 中数据结构与并发 bug 修复演进

A JDK 8 引入链表死循环
B HashMap 线程安全
C JDK 8 引入红黑树并修复并发死循环 bug,但 HashMap 仍非线程安全 ✓ 正确答案
D JDK 8 移除扰动函数
#

21. HashMap 容量为何必须为 2 的幂

A 容量 2 的幂使 hash & (length-1) 等价取模且高效,扩容按高位分组免重算 ✓ 正确答案
B 非 2 的幂容量也能用位运算定位
C 容量 2 的幂是历史遗留无意义
D 容量 2 的幂使 hash % length 更快
#

22. HashMap 扩容时如何利用旧容量对应的高位将节点拆成两组,并避免重新计算完整哈希值

A 扩容后所有节点都移到新桶
B 扩容时重新计算每个节点完整哈希
C 用 hash & oldCap 判断新增高位,把节点拆成 lo/hi 两组,避免重算哈希 ✓ 正确答案
D 扩容只复制首节点
#

23. HashMap 桶树化为何同时受链表长度和数组容量约束,过早树化会付出什么代价

A 链表>=8 就树化,与容量无关
B 树化需链表>=8 且数组>=64,小数组下先扩容解决冲突,树节点内存大、过早树化浪费 ✓ 正确答案
C 树化只受链表长度约束
D 树节点比链表节点内存小
#

24. HashMap 的实现原理(桶数组、链表、红黑树、扰动函数)

A HashMap 只使用链表
B 桶数组 + 扰动函数 + 链表 + 红黑树(长链树化),哈希定位后桶内比较,非线程安全 ✓ 正确答案
C HashMap 线程安全
D 扰动函数让哈希更差
#

25. HashMap 的树化机制能降低哪些复杂度,仍需防范哪些资源攻击

A 树化彻底消除哈希攻击
B 树化把长链查找从 O(n) 降到 O(log n),但哈希冲突攻击仍可造成性能退化,需限制输入规模 ✓ 正确答案
C 哈希攻击无法防范
D 树化后查找恒定 O(1)
#

26. HashSet 与 HashMap 的关系(HashSet 底层实现)

A HashSet 底层是链表
B HashSet 独立实现哈希
C HashSet 底层复用 HashMap,元素作 key、固定 value,去重基于元素 hashCode/equals ✓ 正确答案
D HashSet 有序
#

27. Hashtable 与 HashMap 的差异

A Hashtable 允许 null 键
B HashMap 有树化而 Hashtable 没有
C 两者线程安全
D Hashtable 全方法 synchronized、禁 null,HashMap 非线程安全、允许 null、有树化,并发用 ConcurrentHashMap ✓ 正确答案
#

28. IdentityHashMap 为什么使用引用相等和开放寻址,它适合处理哪些对象图遍历问题

A 它用 equals 比较键
B 用引用相等(==)+ 开放寻址,适合按对象身份做映射(对象图遍历、序列化去重) ✓ 正确答案
C 它与 HashMap 用相同冲突解决
D 它基于 equals 去重
#

29. Iterator 与 ListIterator 的能力差异体现在哪里,哪些集合支持双向遍历与 add/set 操作

A Iterator 支持双向遍历
B ListIterator 可用于 Set
C Iterator 支持 add
D ListIterator 支持双向遍历、add/set、索引,仅 List 可用;Iterator 只向后遍历+删除 ✓ 正确答案
#

30. JDK 21 List.copyOf 不可变集合在共享场景下的发布安全保证

A copyOf 线程不安全
B copyOf 是深拷贝
C copyOf 集合可被修改
D copyOf 创建不可变集合,配合 final/正确发布后线程安全共享,但浅拷贝、可变元素需另行处理 ✓ 正确答案
#

31. JDK 21 顺序集合(Sequenced Collections)

A 它是 JDK 21 的新集合数据类
B 它只适用于 Map
C 它替代 List
D JDK 21 引入 SequencedCollection/Set/Map,统一有序集合的首尾访问与逆序视图 ✓ 正确答案
#

32. Java 9 集合工厂方法 List.of/Map.of 的特性与限制

A 它们返回可变集合
B 返回不可变集合,禁 null、禁重复,修改抛 UnsupportedOperationException,适合定义常量 ✓ 正确答案
C 允许 null
D 允许重复元素
#

33. LinkedHashMap 的访问顺序与 LRU 实现原理

A LinkedHashMap 默认访问顺序
B LinkedHashMap 无序
C accessOrder=true 时按访问重排,配合 removeEldestEntry 删除最久未用元素实现 LRU ✓ 正确答案
D LRU 需要 TreeMap
#

34. LinkedList 的双向链表结构与随机访问代价

A 中间插入 O(1)
B 随机访问 O(1)
C 双向链表,头尾操作 O(1)、随机访问 O(n)、内存开销大,适合头尾队列 ✓ 正确答案
D 内存比 ArrayList 小
#

35. 手写一个支持随机删除的 LRU 缓存(LinkedHashMap 与双链表+HashMap 两种实现)?

A 只能继承 LinkedHashMap
B LRU 需 O(n) 查找
C 核心是 HashMap 定位 + 链表维护顺序,LinkedHashMap(accessOrder) 或双链表+HashMap 均可支持 O(1) get/put/删除 ✓ 正确答案
D 双链表+HashMap 无法随机删除
#

36. List.copyOf 创建的是浅不可变集合还是深不可变对象,元素自身可变时怎样防止状态泄漏

A copyOf 是深不可变
B copyOf 复制元素对象
C copyOf 元素不可被修改
D copyOf 是浅不可变(容器不可变、元素引用共享),防状态泄漏需元素不可变或深拷贝 ✓ 正确答案
#

37. Map.computeIfAbsent 的原子性陷阱

A HashMap 的 computeIfAbsent 并发安全
B 映射函数可递归更新
C 并发需用 CHM,映射函数应无副作用、无递归更新,返回 null 不插入 ✓ 正确答案
D 映射函数保证只调用一次
#

38. Map.merge 在旧值不存在或重映射函数返回 null 时分别做什么,如何用于原子计数

A 旧值不存在时调用重映射函数
B 不存在时放 value,存在时用函数合并,返回 null 删除键,merge(key,1,Integer::sum) 是原子计数惯用法 ✓ 正确答案
C 重映射返回 null 时保留旧值
D merge 不能原子计数
#

39. PriorityBlockingQueue 默认无界意味着什么,消费者变慢时应如何避免堆内存持续增长

A 默认无界、无背压,消费者慢导致内存无限增长,需生产者限流/背压或有界化+监控 ✓ 正确答案
B 无界队列自带背压
C 无界队列不会 OOM
D 队列大小固定
#

40. PriorityQueue 的二叉堆实现与 comparator 失效

A 堆序在修改元素后自动维护
B 二叉堆在插入/删除时维护堆序,修改已入堆的比较字段会使堆序失效,需用不可变元素 ✓ 正确答案
C 修改元素不影响堆序
D PriorityQueue 线程安全
#

41. SynchronousQueue 的公平与非公平模式如何匹配生产者和消费者,对吞吐与饥饿有何影响

A 公平模式用栈,吞吐更高
B 非公平模式用队列
C 两种模式吞吐相同
D 公平模式用队列(FIFO,无饥饿),非公平模式用栈(LIFO,吞吐高但可饥饿) ✓ 正确答案
#

42. TreeMap 与 ConcurrentSkipListMap 的红黑树/跳表实现差异

A 两者都是红黑树
B TreeMap 用红黑树(非线程安全),CSLM 用跳表(无锁线程安全),都 O(log n) 有序 ✓ 正确答案
C 两者都线程安全
D 跳表比红黑树慢
#

43. TreeMap 的 Comparator 若与 equals 不一致,Map 契约、去重结果和 containsKey 会怎样表现

A TreeMap 用 equals 去重
B containsKey 用 equals
C TreeMap 以 Comparator 为键语义,compare==0 视为同一键、containsKey 按比较定位,与 equals 不一致会破坏 Map 契约 ✓ 正确答案
D Comparator 与去重无关
#

44. TreeMap 的 subMap、headMap 和 tailMap 是实时视图,越界写入与原映射修改如何相互影响

A 范围视图是独立副本
B 视图修改不影响原映射
C subMap/headMap/tailMap 是实时视图,范围内修改双向可见,越界写入抛 IllegalArgumentException ✓ 正确答案
D 越界写入静默忽略
#

45. WeakHashMap 与 IdentityHashMap 的使用场景

A WeakHashMap 用弱引用键(键无强引用即回收)适合缓存,IdentityHashMap 用引用相等适合身份映射 ✓ 正确答案
B 两者都用 equals 比较
C WeakHashMap 键永不回收
D WeakHashMap 用 IdentityHashMap 的键
#

46. WeakHashMap 与 SoftReference/WeakReference 在缓存场景下的内存压力差异

A WeakHashMap 保留缓存更久
B 两者都内存不足才回收
C WeakHashMap 用弱引用(键无强引用即回收),SoftReference 内存不足才回收、更利于保留缓存 ✓ 正确答案
D SoftReference 无强引用即回收
#

47. WeakHashMap 的值若强引用自己的键,为何可能阻止条目回收,缓存应如何打破引用环

A 值强引用键不影响回收
B 引用环无法打破
C 弱引用键永远可回收
D 值强引用键会形成引用环阻止键回收,值不应引用键或值用弱引用/软引用打破环 ✓ 正确答案
#

48. equals 与 hashCode 不一致时 HashMap 的查找行为

A 只影响性能不影响查找
B 查找只依赖 equals
C hashCode 定位桶、equals 桶内比较,equals 相等但 hashCode 不同会导致相等对象落入不同桶、查找失败 ✓ 正确答案
D 查找只依赖 hashCode
#

49. fail-fast 与 fail-safe 迭代器的实现差异是什么,modCount 检测与 CopyOnWriteArrayList 快照机制各如何工作

A fail-fast 迭代器不抛异常
B 两者都抛 CME
C fail-fast 用 modCount 检测结构修改抛 CME,fail-safe(如 COW)用快照/弱一致遍历不抛异常 ✓ 正确答案
D fail-safe 用 modCount
#

50. 已知批量元素数量时,怎样使用 ArrayList 初始容量或 ensureCapacity 减少扩容与数组复制

A 扩容无复制成本
B 用初始容量或 ensureCapacity 预分配,避免批量加入时多次扩容复制 ✓ 正确答案
C ensureCapacity 只缩小容量
D 初始容量与 size 相同
#

51. 把可变对象作为 HashMap 键后再修改参与哈希的字段,会导致哪些查找与删除异常

A 修改哈希字段不影响查找
B 修改字段后自动迁移
C HashMap 会重算桶位置
D 修改参与哈希的字段使 hashCode 改变,get/remove 定位错误桶、键泄漏,需用不可变键 ✓ 正确答案
#

52. 流式集合(Streams)与集合操作的边界

A Collection 存储数据、Stream 是惰性一次性计算管道,Stream 终端操作后不可复用 ✓ 正确答案
B Stream 可重复使用
C Stream 存储数据
D Stream 是急切求值
#

53. 访问顺序 LinkedHashMap 的 get 操作为何会改变结构,作为并发 LRU 缓存时应如何同步

A get 不改变结构
B LinkedHashMap 线程安全
C get 无需同步即可并发
D accessOrder=true 时 get 会重排链表(结构性修改),并发 LRU 需同步整个操作或用线程安全 LRU ✓ 正确答案
#

54. 跨服务传输集合时为何应优先定义稳定 DTO,而不是依赖具体集合实现的 Java 序列化形式

A Java 序列化集合跨语言稳定
B 直接序列化 ArrayList 更高效
C 应定义稳定 DTO(字段与类型契约),避免依赖具体集合实现的序列化形式,保证跨版本/跨语言稳定 ✓ 正确答案
D DTO 会暴露内部实现
#

55. 遍历 Collections.synchronizedList 时为什么仍需对返回列表加锁,流式遍历是否例外

A 迭代器自动同步
B 流式遍历无需加锁
C synchronizedList 只同步单方法,迭代器与流式遍历都需手动加锁,CopyOnWriteArrayList 等快照集合才例外 ✓ 正确答案
D 迭代器遍历安全无需加锁
#

56. 集合创建 Stream 后再结构性修改源集合属于什么干扰行为,结果为何不能依赖 fail-fast

A 结果确定可靠
B 流执行期间修改源集合是未定义行为,fail-fast 的 CME 只是尽力检测非保证,不能依赖 ✓ 正确答案
C 一定会抛 CME
D 结果总是正确
#

57. ArrayDeque 通过循环数组实现双端操作时如何处理头尾回绕,为什么不允许存储 null

A 循环数组用位运算回绕指针,null 用作空位标记故禁止存储 ✓ 正确答案
B 允许存储 null
C null 与空位可区分
D 回绕用除法
#

58. BitSet 的 size、length 和 cardinality 分别表示什么,序列化稀疏高位数据时有何影响

A length 是容量
B size 是置位个数
C size 是容量、length 是最高置位+1、cardinality 是置位个数,稀疏高位数据序列化会带上大量空 word 体积大 ✓ 正确答案
D cardinality 是容量
#

59. BitSet 的位运算加速与序列化

A 位运算按位逐个执行
B 位运算 O(n) 逐位
C 用 long[] 存储,and/or/xor 按整字位运算加速集合运算,序列化按 words 存储 ✓ 正确答案
D 不支持集合运算
#

60. BlockingQueue 的常见实现(Array/Linked/Priority/Delay)

A ArrayBlockingQueue 无界
B PriorityBlockingQueue 有界
C DelayQueue 立即出队
D ArrayBlockingQueue 有界、PriorityBlockingQueue 按优先级出队、DelayQueue 延迟到期出队,都支持阻塞 put/take ✓ 正确答案
#

61. Collection.toArray(IntFunction) 如何避免不安全的数组强转,目标数组元素类型由谁决定

A 返回 Object[] 需强转
B 目标数组类型由编译器固定
C toArray(IntFunction) 按函数生成正确类型的数组,避免强转,类型由传给函数的数组类型决定 ✓ 正确答案
D 它总是返回 Object[]
#

62. DelayQueue 如何结合 getDelay 与 compareTo 决定出队顺序,延迟相同的元素如何保证确定性

A 出队不检查到期
B 出队顺序由 getDelay 决定
C 延迟相同元素顺序确定
D compareTo 决定排序(PriorityQueue)、getDelay 判断到期,延迟相同需 compareTo 加次级键保证确定性 ✓ 正确答案
#

63. EnumMap 与 EnumSet 的位图实现

A EnumMap 用数组按 ordinal 索引,EnumSet 用位图按 ordinal 置位,都高效紧凑 ✓ 正确答案
B EnumMap 用哈希
C EnumSet 用树
D 两者都 O(log n)
#

64. ImmutableCollections 的内部表示(NIL/SetN 等)

A 工厂方法返回的不可变集合内部用紧凑数组/字段(ListN/SetN/MapN/List12 等)存储,NIL 表示空 ✓ 正确答案
B 内部用 HashMap
C 它是可变集合
D 内部实现可依赖
#

65. JDK 21 SequencedCollection 的 reversed 返回何种视图,双向修改时首尾语义如何对应

A reversed() 返回副本
B reversed() 返回逆序视图(非副本),首尾语义镜像,双向修改反映到原集合 ✓ 正确答案
C reversed() 是 O(n) 复制
D 逆序视图修改不影响原集合
#

66. LinkedBlockingQueue 未显式指定容量时有什么风险,容量与生产者背压应怎样协同配置

A 默认有界
B 默认无界有 OOM 风险,应显式设容量并配 put 阻塞/offer 超时实现背压,按吞吐配置容量 ✓ 正确答案
C 无界队列有背压
D 容量越大越好
#

67. TreeMap 的底层红黑树实现细节(旋转/染色)与一致性遍历?

A 红黑树用单链表
B 遍历无序
C 红黑树不保证平衡
D 红黑树用旋转/染色维持平衡(O(log n)),中序遍历按 key 有序,迭代器 fail-fast ✓ 正确答案
#

68. List.of 与 Set.of 为什么拒绝 null,构造 Set 时出现重复元素又会抛出什么异常

A List.of 允许 null
B Set.of 允许重复
C 两者拒 null(NPE),Set.of 重复元素抛 IllegalArgumentException,List.of 允许重复 ✓ 正确答案
D List.of 拒重复
#

69. List、Set、Map 接口层次与典型实现类的特性对比

A List 有序可重复、Set 去重、Map 键值,实现类按哈希/链表/树/保序/线程安全选择 ✓ 正确答案
B Map 也去重
C List 去重
D Set 有序可重复
#

70. Map.compute、computeIfAbsent 与 putIfAbsent 对函数调用和 null 值处理有哪些关键差异

A computeIfAbsent 总是调用函数
B putIfAbsent 调用函数
C putIfAbsent 无条件填值、computeIfAbsent 缺失才计算(null 不插入)、compute 总是计算(null 删除键) ✓ 正确答案
D compute 不调用函数
#

71. PriorityQueue 中比较结果相同的元素是否保持插入顺序,需要稳定优先级时应如何设计键

A 比较相同保插入顺序
B PriorityQueue 不稳定,比较相同不保序,加递增序号作次级比较键可实现稳定 ✓ 正确答案
C 稳定是默认行为
D 无法实现稳定
#

72. SequencedMap 的 putFirst 和 putLast 在有序映射上如何定义,SortedMap 实现为何可能拒绝操作

A SortedMap 必须支持 putFirst
B 所有 Map 都支持
C SortedMap 顺序由 key 排序决定,putFirst/putLast 可能抛 UnsupportedOperationException,保序映射(LinkedHashMap)才支持 ✓ 正确答案
D putFirst 无需排序支持
#

73. Spliterator 在并行流中的角色

A Spliterator 只用于顺序流
B Spliterator 不拆分
C Spliterator 通过 trySplit 拆分数据源供并行流分治处理,特征决定优化假设 ✓ 正确答案
D 并行流不用 Spliterator
#

74. Vector/Stack 的遗留问题与替代方案

A Vector/Stack 是遗留同步集合,性能差,Stack 继承 Vector 设计不良,替代用 ArrayList/ArrayDeque ✓ 正确答案
B Vector 是推荐集合
C Stack 设计良好
D Vector 性能好
#

75. 比较 ArrayList、HashSet 与树结构的真实内存占用时,如何用 JOL 和基准测试避免只看元素数量

A 只看元素数量即可
B 容量不影响内存
C 元素数量决定一切
D 用 JOL 实测 totalSize、JMH 基准,考虑容量、节点结构、对象头,避免只看元素数量 ✓ 正确答案
#

76. 自定义 Spliterator 的 trySplit 应满足哪些覆盖与不重复条件,错误拆分会怎样破坏并行结果

A 拆分可重复元素
B trySplit 必须划分不重叠且覆盖全集,否则并行流结果重复/缺失 ✓ 正确答案
C 拆分可遗漏元素
D 拆分错误不影响并行结果
#

77. Sequenced Collections(JDK 21)的 getFirst/getLast/addFirst/addLast 与集合接口演进

A JDK 21 引入 SequentialCollection/Set/Map 统一有序集合的首尾访问与逆序视图,List/Deque/有序集合实现 ✓ 正确答案
B 它替代了所有 List
C 它只提供 getFirst
D 它只用于 ArrayList
#

78. 如何选择 ArrayList/LinkedList/ArrayDeque,插入、随机访问、内存布局的综合对比如何?

A ArrayList 随机访问/尾部优、ArrayDeque 双端优、LinkedList 头尾优但随机访问/内存差,多数场景 ArrayList/ArrayDeque 更优 ✓ 正确答案
B LinkedList 随机访问 O(1)
C LinkedList 内存紧凑
D ArrayDeque 支持随机访问