Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

集合

49 道题目
我的收藏与复习
题干与完整题解免费阅读第 4 / 5 页

答:Hashtable 的常用读写方法使用同步,竞争线程需要先取得同一个表对象的监视器,才能进入这些受保护操作。这样能保护方法内部的数据结构与更新可见性。但线程安全有边界:多个调用组成的判断、计算和更新,仍需要原子方法或同一外部同步范围。

专注学习

答:fail-fast 是某些迭代器尽早发现不允许的结构修改并抛 ConcurrentModificationException 的机制。ArrayList 等实现通常比较修改计数与迭代器记住的计数。它只是尽力发现误用,不保证检测所有竞争,也不提供线程安全;单线程修改不当同样可能触发。

专注学习

答:先区分不可修改视图、独立副本与元素本身不可变。Collections.unmodifiableList 只禁止经该视图修改,原列表变化仍可见;List.copyOf 创建结构不受原列表后续修改影响的不可修改列表。二者通常都不深拷贝元素。final 只禁止变量重新指向,不会冻结集合内容。

专注学习

答:常见方式有下标循环、增强 for、Iterator、ListIterator、forEach 和 Stream。普通只读遍历常用增强 for;要在游标处删除或插入,使用支持这些操作的迭代器。下标循环适合随机访问列表,反复对 LinkedList 调用 get(i) 可能把整次遍历变成 O(n²)。

专注学习

答:若容器支持,使用当前 Iterator 的 remove,或直接调用 removeIf 表达删除条件。不要在增强 for 中随意调用容器自己的 remove,破坏遍历器状态。对于不可修改集合、快照迭代器或并发集合,要分别遵守其删除约定,不能套用一种写法。

专注学习

答:对象数组转 List 可用 Arrays.asList,它返回连接原数组的固定大小列表;需要独立可增长列表,再用 ArrayList 构造复制。List 转对象数组可用 toArray(String[]::new)。基本类型数组不会被 Arrays.asList 自动拆成多个包装元素,必须显式装箱或逐项复制。

专注学习

答:需要先说明测试条件。ArrayList 尾部追加的摊销成本通常是 O(1),中间插入需移动引用;LinkedList 已定位后的插入成本低,但索引定位最坏 O(n),还要分配节点;Vector 也基于数组,常用方法带同步。比较前必须说清插入位置、容量与线程数。

专注学习

答:ArrayList 没有内置同步。共享且有人修改时,要统一锁住相关访问,或按负载换成 synchronizedList、CopyOnWriteArrayList 等方案。只读共享也需要正确发布,并约束元素内部状态。fail-fast 只能帮助发现错误,不能代替同步或保证每次竞争都会报错。

专注学习
本页 10 道,共 49 道浏览其他领域