答:数组长度创建后固定,可以直接保存基本类型,也能保存对象引用;ArrayList 是可增长的引用列表,泛型参数不能直接写 int 等基本类型。数据量固定、处理基本数值或与要求数组的 API 交互时,数组很合适;需要频繁追加并使用列表接口时,ArrayList 更方便。
答:并发集合为共享访问提供明确的同步与遍历语义,例如 ConcurrentHashMap 用于并发映射,CopyOnWriteArrayList 用于读多写少的快照遍历,ConcurrentLinkedQueue 用于非阻塞队列,BlockingQueue 增加等待能力。它们不是一种统一数据结构,也不是所有操作都没有锁。
答:Vector 与 ArrayList 是数组列表,随机位置读取是 O(1),中间插删通常要移动引用;LinkedList 是双向链表,按位置读取最坏 O(n),已定位后的链接修改便宜。Vector 的常用方法同步,另两者没有内置同步。比较应先固定操作位置、定位方式与并发条件。
答:HashMap 和 Hashtable 按哈希组织键,TreeMap 按比较规则维护有序键。HashMap 不同步且允许 null 键和值;Hashtable 常用方法同步并拒绝 null;TreeMap 不同步,允许 null 值,自然顺序下拒绝 null 键,定制比较器能够处理 null 时可另行支持。
答:要把“找到位置”和“修改结构”分开。ArrayList 找下标快,但中间插删要移动后续引用;LinkedList 改链接便宜,但用索引寻找中间节点通常要走链。只有已经通过迭代器定位等条件成立时,链表局部插删的优势才不会被定位成本掩盖。
答:两者都保存键值映射,但迁移时要检查同步、null、遍历和复合操作语义。HashMap 无内置同步,允许 null 键和值;Hashtable 常用方法同步且拒绝 null。不能只替换构造器就认为行为等价,也不能假设某一种实现提供稳定的键迭代顺序。
答:常见选择是 HashSet、LinkedHashSet、TreeSet:分别适合普通去重、保留相遇顺序、按比较规则排序和范围导航。还有适合枚举的 EnumSet,以及不同并发需求下的 CopyOnWriteArraySet、ConcurrentSkipListSet,或 ConcurrentHashMap.newKeySet。不存在满足所有要求的默认 Set。
答:Hashtable 的常用读写方法同步在同一表对象上;ConcurrentHashMap 面向更高并发访问设计,读取通常不需锁住整个表,并提供单键原子更新方法。两者都拒绝 null。Java 21 的 ConcurrentHashMap 不是旧式固定 Segment 分段锁实现,具体路径要按版本解释。
答:HashMap 保存键值对,用键找到对应值;HashSet 只表达某个元素是否存在,不提供独立业务值。HashSet 内部借用 HashMap,把元素放在键的位置,用统一占位值实现去重。因此二者共享哈希查找思路,但公开语义、方法参数和返回结果不同。
答:不能给所有 Set 一个相同答案。HashSet 先按哈希定位,再用引用相同或 equals 匹配;TreeSet 依自然顺序或 Comparator,以比较结果为零识别已有元素。== 对引用比较的是是否为同一个对象,equals 则可由类型定义业务相等,二者不是一回事。