collection接口不能实例化,仅定义add()、remove()等统一方法签名,实现类均间接实现它;它继承iterable支持增强for循环,但无get(int index)——此为list特有;list有序可重复,set无序不重复。

Collection 接口本身不能实例化,只定义通用契约
你写 new Collection() 会直接编译报错——它只是个接口,不提供具体实现。所有实际使用的集合类(如 ArrayList、HashSet)都通过继承 List 或 Set 等子接口间接实现 Collection。它的核心价值是统一方法签名:add()、remove()、contains()、iterator() 等,让上层代码能面向接口编程,比如传入任意 Collection 子类而不关心具体类型。
注意:Collection 继承自 Iterable,所以所有实现类天然支持增强 for 循环;但它不包含 get(int index) 这类索引操作——那是 List 的专属能力。
List 和 Set 的行为差异直接决定能否用 for 循环或存重复值
List 是有序可重复的序列,支持按索引访问,因此你能放心用 for (int i = 0; i 或 <code>list.get(0);Set 则禁止重复、无索引、不保证顺序(HashSet 甚至每次遍历顺序都可能不同),所以你不能用下标访问,也不能依赖插入顺序——除非你选 LinkedHashSet。
-
ArrayList:适合频繁读取、尾部增删,但中间插入/删除要移动元素,性能差 -
LinkedList:适合频繁在任意位置增删,但随机访问慢(需遍历链表) -
HashSet:靠哈希码快速查重,增删查平均 O(1),但不排序、不保序 -
TreeSet:自动按自然序或Comparator排序,查删是 O(log n),比HashSet慢但有顺序保障
选型关键看三个硬指标:是否需要顺序?是否允许重复?是否需要排序?
别凭感觉选,按业务约束反推:
- 要按插入顺序遍历且允许重复 → 选
ArrayList(最常用)或LinkedList(高频中间修改) - 要自动去重,且不关心顺序 →
HashSet(最快) - 要自动去重,且必须按某种顺序迭代(比如从小到大)→
TreeSet - 要自动去重,又想保持插入顺序 →
LinkedHashSet(内部用链表维护顺序 + 哈希表查重) - 要线程安全?别直接用
Vector或Stack(已过时),改用Collections.synchronizedList()或CopyOnWriteArrayList
常见误用:用 HashSet 存对象却没重写 hashCode() 和 equals() → 导致重复元素无法被识别,contains() 总返回 false。
Queue 和 Deque 不是“替代 List/Set”,而是解决特定数据流问题
Queue 接口不是为通用存储设计的,它的语义是“等待处理的数据流”:典型操作是 offer()(入队)、poll()(出队)、peek()(看头不取)。如果你只是想存一堆东西并遍历,别用 PriorityQueue 或 ArrayDeque 代替 ArrayList——它们不支持 get(0),也不保证遍历顺序符合直觉。
Deque(双端队列)扩展了 Queue,支持两端操作,因此也能模拟栈(push()/pop());但它的主要价值不在“当栈用”,而在需要头尾高效增删的场景,比如滑动窗口、任务缓冲区。
真正容易被忽略的是:即使你用了 ArrayDeque,它也不是 ArrayList 的更快替代品——两者内存布局和访问模式完全不同,盲目替换可能让随机访问变慢一个数量级。










