答:典型 OpenJDK 7 HashMap 用数组加链表;OpenJDK 8 增加红黑树桶,以改善严重碰撞时的搜索,并调整哈希扰动与扩容迁移方式。比较必须限定版本:以下历史实现分别核对 jdk7-b147 与 jdk8-b132,不能把所有 7u 更新都概括成完全一样。Java 21 沿用数组、链表与树桶的总体思路。
答:不同键可能得到相同哈希,或经下标计算落入同一桶。HashMap 允许它们共存,在桶内继续比较键。OpenJDK 21 使用链表或树桶组织这些条目,并在合适条件下扩容或树化;相等键则更新原映射,不是再追加一条。冲突与重复键是两种情况。
答:它们不可变,并提供一致的 equals 与 hashCode,实现值相等且哈希稳定,能减少入表后键状态变化导致的查找问题。String 是文本类,Integer 才是基本类型的包装类,原题把两者统称为“包装类”,这里需要纠正。适合作为键也不意味着哈希绝不碰撞,或业务上总应使用它们。
答:hashCode 的取值范围很大,还可能是负数,而桶数组只有有限长度,不能直接作为下标。OpenJDK 21 先混合高低位,再用容量减一与哈希做按位与,把结果限制在合法范围。哈希值用于分区,不是对象在内存中的地址,也不需要全局唯一。
答:两者都拒绝 null 并支持线程共享,但 ConcurrentHashMap 通常更适合新的并发映射需求:提供单键原子更新、通常不阻塞的读取和弱一致遍历。Hashtable 常用方法围绕同一表同步,更多见于兼容代码。选用时应比较所需原子范围与遍历一致性,而不是只看“都有锁”。
答:Collections 是工具类,不是“一个函数”。常用静态方法包括 sort、reverse、shuffle、binarySearch、frequency、min/max,以及同步或不可修改包装。使用前要核对方法是否修改传入集合、是否要求有序、空输入怎样处理;返回结果不一定是独立副本。
答:HashSet 是集合类,创建实例后调用 add、contains、remove 等方法管理唯一成员。add 返回是否真的新增,remove 返回是否真的删除;它不承诺遍历顺序,也不支持按下标读取。元素需要遵守 equals、hashCode 约定,相关状态入集合后应保持稳定。
答:TreeSet 根据自然顺序或构造时传入的 Comparator 排列元素,用比较结果为零判重,并提供 first、last、floor、ceiling、subSet 等顺序导航。它是类,不是“排序函数”。适合需要持续有序和范围查询的成员集合;只做普通去重时,不必为排序额外付出维护成本。
答:先选符合容器特点的遍历方式,再减少循环里的重复工作。LinkedList 用迭代器顺序走,避免反复 get(i);Map 需要键和值时直接遍历 entrySet;只找一个结果时及时结束。forEach、Stream、并行流没有固定速度排名,优化应依据真实数据和测量结果。