Collection → List(有序、可重复) / Set(无序、唯一) / QueueMap:键值映射,键唯一。SortedMap、NavigableMap 扩展有序功能。Enumeration(已被 Iterator 取代)。| 类 | 底层结构 | 特点 | 线程安全 |
|---|---|---|---|
| ArrayList | 动态数组 | 随机访问快,扩容 1.5倍,插删慢 | 否 |
| LinkedList | 双向链表 | 首尾增删快,随机访问慢 | 否 |
| HashSet | HashMap | 无序、唯一、允许一个 null | 否 |
| LinkedHashSet | HashMap+链表 | 保持插入顺序 | 否 |
| TreeSet | 红黑树 | 自然序/定制序有序 | 否 |
| HashMap | 数组+链表/红黑树 | 键值映射,JDK8 链表树化 | 否 |
| TreeMap | 红黑树 | 键有序 | 否 |
| Vector | 动态数组 | 同步方法,扩容 2倍,**遗留类** | 是 |
| Hashtable | 数组+链表 | 同步,**遗留类** | 是 |
| Properties | Hashtable | 键值均为 String,配置文件专用 | 是 |
| Stack | Vector | LIFO 栈,**遗留类** | 是 |
| BitSet | 位数组 | 位操作,动态扩容 | 否 |
// List 遍历三种方式
List list = new ArrayList<>();
list.add("nick"); list.add("jenny"); list.add("Maria");
// 1. for-each (最常用,只读)
for (String s : list) System.out.println(s);
// 2. toArray 转数组 (需快速随机访问或传遗留 API)
String[] arr = list.toArray(new String[0]);
for (String s : arr) System.out.println(s);
// 3. Iterator (唯一可安全删除)
Iterator it = list.iterator();
while (it.hasNext()) { if ("jenny".equals(it.next())) it.remove(); }
// Map 遍历三种方式
Map map = new HashMap<>();
map.put("name", "nick"); map.put("age", "18");
// 1. keySet + get (两次查找,性能稍差)
for (String k : map.keySet()) System.out.println(k + "=" + map.get(k));
// 2. entrySet + Iterator (通用)
for (Map.Entry e : map.entrySet())
System.out.println(e.getKey() + "=" + e.getValue());
// 3. entrySet + for-each (推荐,清晰高效)
for (Map.Entry e : map.entrySet())
System.out.println(e.getKey() + "=" + e.getValue());
// 4. values() (仅需值)
for (String v : map.values()) System.out.println(v);

早期迭代器,方法:hasMoreElements()、nextElement()。Vector、Properties 仍保留 elements() 返回它。
高效存储海量布尔标志。核心操作:set/clear/flip/get、逻辑运算 and/or/xor、cardinality() 统计 true 个数。
BitSet bits1 = new BitSet(16), bits2 = new BitSet(16);
// 设置偶数位、非5倍数位
bits1.set(0); bits1.set(2)...; bits2.set(1); bits2.set(2)...
bits2.and(bits1); // 交集
bits2.or(bits1); // 并集
bits2.xor(bits1); // 异或
构造:Vector()、Vector(size)、Vector(size, incr)。扩容策略:incr>0 按增量,否则翻倍。方法丰富但同步开销大,单线程首选 ArrayList。
继承 Vector。核心:push()、pop()、peek()、empty()、search()。
Dictionary:抽象类,键值映射原型。Hashtable:实现 Dictionary/Map,同步,不允许 null 键值。Properties:继承 Hashtable,load/store 支持配置文件读写,getProperty(key, default) 提供默认值。ClassCastException。public static void printArray(E[] inputArray) {
for (E e : inputArray) System.out.printf("%s ", e);
System.out.println();
}
// 调用
printArray(new Integer[]{1,2,3});
printArray(new String[]{"A","B"});
<T extends Comparable<T>>public static > T maximum(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) max = y;
if (z.compareTo(max) > 0) max = z;
return max;
}
// 支持 Integer、Double、String 等实现 Comparable 的类型
public class Box {
private T t;
public void add(T t) { this.t = t; }
public T get() { return t; }
}
// 使用
Box intBox = new Box<>();
Box strBox = new Box<>();
List> :不可写(仅可读取 Object),是所有 List 父类。List extends Number>:上界通配,可读 Number 子类,**不可写**(除 null)。List super Integer>:下界通配,可写 Integer 及父类,**读取仅得 Object**。public static void getData(List> data) { System.out.println(data.get(0)); }
public static void getUpperNumber(List extends Number> data) { System.out.println(data.get(0)); }
// 调用
getData(nameList); getData(ageList); getData(numberList); // 皆可
getUpperNumber(ageList); getUpperNumber(numberList); // 可
// getUpperNumber(nameList); // 编译报错,String 非 Number
集合框架是 Java 容器编程的基石,掌握 接口契约、实现特性、遍历模式 是核心。遗留类了解原理即可,实战首选框架类。泛型通过编译期类型参数化,构建了类型安全的抽象层,**通配符配合 PECS 原则** 解决了泛型协变/逆变难题,是进阶必修课。