# 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 支持随机访问