答:常用入口是 Collection 和 Map。Collection 管一组元素,下面有 List、Set、Queue,Deque 又扩展 Queue;Map 管键值对应关系,不属于 Collection。Java 21 还增加 SequencedCollection、SequencedSet、SequencedMap,用统一方法表达有明确相遇顺序的集合。
答:HashMap 把键值对放进桶数组。写入或查询时,先根据键的哈希值定位桶,再在桶内比较键;键已经存在就替换值,否则新增映射。OpenJDK 21 的桶可以是链表或树,元素增多时可能扩容。它允许 null 键和值,不保证遍历顺序,也不保证线程安全。
答:HashMap 不同步,允许一个 null 键及多个 null 值;Hashtable 的常用读写方法有同步保护,不允许 null 键和值。两者都不提供键的排序保证。新代码通常先考虑 HashMap;确实需要并发共享映射时,按操作语义选择 ConcurrentHashMap 或外部同步方案。
答:这里的“有序”按元素已经依比较规则排好来理解。无序数组通常需要逐个查找;有序数组能二分查找,但维持顺序时插入或删除往往要移动元素。选择时看查询与更新的比例、是否需要按顺序输出,以及数据量,不能只比较一次查找的复杂度。
答:先按业务语义选接口,再按访问方式选实现:有位置用 List,去重用 Set,按键找值用 Map,排队用 Queue。声明泛型,明确顺序、null、可修改性与并发要求;数据量可估计时合理预分配。性能优化应有测量依据,避免只背“哪个类更快”。
答:HashSet 按哈希与 equals 判重,不保证遍历顺序;TreeSet 按自然顺序或比较器排序,以比较结果为零判断是否已有元素。HashSet 的基本操作在哈希分布合适时通常接近 O(1),TreeSet 的 add、remove、contains 保证 O(log n)。选择还要看是否需要范围查询。
答:Enumeration 是较早的遍历接口,提供 hasMoreElements 与 nextElement,不提供删除操作。Iterator 使用 hasNext、next,并定义可选的 remove 操作。现代集合通常用 Iterator;但是否允许删除、是否快速失败,都由具体容器和迭代器决定,不能只凭接口名判断。
答:Collection 是描述一组元素的接口,规定 add、remove、iterator 等能力;Collections 是工具类,提供排序、查找、包装等静态方法。List、Set、Queue 属于 Collection 这一支;Map 单独定义键值语义。前者规定容器能力,后者提供操作工具。
答:List 表达有位置、可重复的序列;Set 表达不重复的成员;Map 表达键与值的对应,一个键至多对应一个值;Queue 表达待处理元素及取出策略。Queue 不一定先进先出,例如优先队列按优先级取出。容器是否接受 null、是否可修改,要看具体实现。
答:ArrayList 用可增长数组保存元素引用,按下标访问快,尾部追加的摊销成本低;LinkedList 用双向链表,按下标访问要沿节点寻找。链表已定位节点后的插删成本低,但按位置插删还要先定位。因此不能简单说“查询用数组,增删用链表”,普通列表通常先考虑 ArrayList。