Collection 是所有集合的父接口(JDK 1.5+ 继承 Iterable),定义了通用操作:
| 方法 | 功能 | 注意事项 |
|---|---|---|
add(E e) | 添加元素 | 返回 boolean,Set 添加重复返回 false |
remove(Object o) | 删除指定元素 | **仅接收元素对象**,不接受索引(List 子类重载了索引版) |
clear() | 清空集合 | |
size() | 获取元素个数 | 区别:String.length()、数组.length |
contains(Object o) | 判断包含元素 | 常用于去重逻辑 |
toArray() | 转数组 | 推荐 toArray(new T[0]) 类型安全 |
// 集合 -> 数组
Integer[] arr = list.toArray(new Integer[0]);
// 数组 -> 集合 (固定长度列表,不可增删)
List list = Arrays.asList(arr);
// 可变列表
List mutableList = new ArrayList<>(Arrays.asList(arr));
List list = new ArrayList<>(Arrays.asList("a", "a", "b", "a"));
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("a")) {
list.remove(i--); // 关键:删除后索引回退,防止漏删相邻元素
}
}
// 结果: [b]
// 错误示范:运行时抛 ConcurrentModificationException
for (String s : list) {
if ("b".equals(s)) list.remove("b");
}
// 原因:增强 for 底层用 Iterator,但未暴露 remove() 方法,直接修改集合结构触发 fail-fast。
Iterator it = list.iterator();
while (it.hasNext()) {
String s = it.next(); // 必须先赋值,否则连续调用 next() 会跳过元素
if (s.equals("a")) {
it.remove(); // 唯一安全的遍历中删除方式
}
}
// 结果: [b]
public class CollectionDemo {
public static void main(String[] args) {
fun2(); // 推荐方式
}
static void fun() { /* 普通 for 删除 */ }
static void fun1() { /* 增强 for 尝试删除 -> 抛异常 */ }
static void fun2() { /* Iterator 删除 */ }
}
for (E e : list)。next() 结果存变量后再判断。i-- 或索引回退 i--。CopyOnWriteArrayList 或 Collections.synchronizedList + 同步块。