首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

一起学 Java(三):集合框架、经典数据结构与泛型完整指南

     編輯:Java 綜合教學

一、Java 集合框架体系

核心三要素

  1. 接口:抽象数据类型(Collection、List、Set、Map 等),定义规范。
  2. 实现类:具体数据结构(ArrayList、HashMap、TreeSet 等),可复用。
  3. 算法:静态工具方法(Collections.sort/binarySearch 等),多态复用。

接口继承层次

  • Collection → List(有序、可重复) / Set(无序、唯一) / Queue
  • Map:键值映射,键唯一。SortedMap、NavigableMap 扩展有序功能。
  • 遗留接口:Enumeration(已被 Iterator 取代)。

主流实现类对比表

类底层结构特点线程安全
ArrayList动态数组随机访问快,扩容 1.5倍,插删慢否
LinkedList双向链表首尾增删快,随机访问慢否
HashSetHashMap无序、唯一、允许一个 null否
LinkedHashSetHashMap+链表保持插入顺序否
TreeSet红黑树自然序/定制序有序否
HashMap数组+链表/红黑树键值映射,JDK8 链表树化否
TreeMap红黑树键有序否
Vector动态数组同步方法,扩容 2倍,**遗留类**是
Hashtable数组+链表同步,**遗留类**是
PropertiesHashtable键值均为 String,配置文件专用是
StackVectorLIFO 栈,**遗留类**是
BitSet位数组位操作,动态扩容否

代码示例:List 与 Map 遍历最佳实践

// 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);

代码运行截图

二、经典数据结构详解(遗留类但需理解原理)

1. Enumeration 接口

早期迭代器,方法:hasMoreElements()、nextElement()。Vector、Properties 仍保留 elements() 返回它。

2. BitSet 位集合

高效存储海量布尔标志。核心操作: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); // 异或

3. Vector 动态数组(同步)

构造:Vector()、Vector(size)、Vector(size, incr)。扩容策略:incr>0 按增量,否则翻倍。方法丰富但同步开销大,单线程首选 ArrayList。

4. Stack 栈(LIFO)

继承 Vector。核心:push()、pop()、peek()、empty()、search()。

5. Dictionary / Hashtable / Properties

  • 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:上界通配,可读 Number 子类,**不可写**(除 null)。
  • List:下界通配,可写 Integer 及父类,**读取仅得 Object**。
  • PECS 原则:Producer Extends, Consumer Super。
public static void getData(List data) { System.out.println(data.get(0)); }
public static void getUpperNumber(List data) { System.out.println(data.get(0)); }
// 调用
getData(nameList); getData(ageList); getData(numberList); // 皆可
getUpperNumber(ageList); getUpperNumber(numberList); // 可
// getUpperNumber(nameList); // 编译报错,String 非 Number

总结

集合框架是 Java 容器编程的基石,掌握 接口契约、实现特性、遍历模式 是核心。遗留类了解原理即可,实战首选框架类。泛型通过编译期类型参数化,构建了类型安全的抽象层,**通配符配合 PECS 原则** 解决了泛型协变/逆变难题,是进阶必修课。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved