答:常见的两种方式是:让类型实现 Comparable,定义自然顺序;或在排序时传入 Comparator,定义本次使用的顺序。前者把默认比较规则写在类型中,后者适合多种排序口径。它们描述比较规则,不是 Java 只有两种排序算法。
答:HashMap 允许 null 键和值,Hashtable 都不允许;HashMap 的 get 返回 null,既可能是没有该键,也可能是该键对应 null,需要 containsKey 辅助区分。Hashtable 常用方法有同步保护,但多个调用拼起来仍不自动原子化。这些差异会影响查询逻辑和旧代码迁移。
答:HashSet 内部用 HashMap 保存元素:元素作为键,值使用统一的占位对象。add 是否新增,取决于内部映射里是否已经有相等的键;contains 与 remove 也借助键查找。因此,HashSet 依赖元素稳定的 hashCode 与 equals,而不是把对象的地址当作唯一标准。
答:先分清元素数、容量与扩容阈值。无参新建的 ArrayList 和 HashMap,size 都是 0。OpenJDK 21 中,两者都延迟分配实际存储;ArrayList 首次普通追加通常分配 10 个槽位,HashMap 首次插入通常分配 16 个桶,默认负载因子为 0.75,阈值为 12。
答:集合框架把容器契约、存储实现与通用算法分开:接口定义可用操作,ArrayList、HashMap 等实现选择数据结构,Collections 等工具提供排序或包装方法。算法依赖约定工作,而实现负责兑现约定。不同实现可以共享接口,但复杂度、顺序和并发能力仍可能不同。
答:先确认方法是修改原集合、返回视图,还是创建新结果,再检查输入条件。排序和反转会改列表;unmodifiableList 返回不可修改视图,不隔离原列表变化;synchronizedList 保护单次调用,遍历还需遵守同步规则。只读、快照与线程安全是不同要求。
答:可以先问数据怎样使用:逐项遍历看 Iterable,管理一组元素看 Collection,按位置访问看 List,唯一成员看 Set,等待处理看 Queue,两端操作看 Deque,键值对应看 Map。Java 21 的 Sequenced 系列补充首尾及反向视图能力,不能用旧版接口名单替代当前结构。
答:Collection 的基本单位是一个元素,Map 的基本单位是键到值的映射。Map 的 put 需要两个角色,键必须唯一而值可以重复,无法直接套用 Collection.add 的单元素语义。因此,Java 把它们设计成两个接口分支,再通过 keySet、values、entrySet 提供集合视图。
答:HashMap 不提供内置同步;Hashtable 的常用读写方法同步在表对象上,保护这些单次调用。它们都不能让调用方随意拼接的多步逻辑自动原子化。比较时还要说明 null:HashMap 允许 null 键和值,Hashtable 拒绝;二者也都不保证键的排序。
答:两者都以可增长数组实现 List,支持按位置访问、重复值和 null。ArrayList 不提供内置同步,Vector 的常用方法带同步保护。新代码通常先选 ArrayList;多线程需求应按访问模式选择同步包装器或并发集合,而不是只凭 Vector 的同步标签决定。