Java基础(三:集合框架:List、Set、Map)

36 阅读4分钟

Java Collections Framework (JCF) 是一个统一的架构,用于表示和操作集合。它包含以下主要组件:

  • Interfaces:定义了不同类型的集合行为
  • Implementations:提供了接口的具体实现
  • Algorithms:对集合执行有用的操作的方法

主要接口分类

1. Collection 接口

这是集合层次结构的根接口。

子接口:

List 接口
  • 特点:有序集合(序列),允许重复元素
  • 索引访问:可以通过整数索引访问元素
  • 主要实现类
    • ArrayList: 动态数组实现,非线程安全
    • LinkedList: 双向链表实现,适合频繁插入删除
    • Vector: 同步版本的 ArrayList
    • Stack: 继承自 Vector,后进先出栈

主要方法:

    - **添加元素**    - `add(E element)`:在列表末尾添加元素
  • add(int index, E element):在指定位置插入元素

  • addAll(Collection<? extends E> c):添加集合中的所有元素

  • 访问元素: - get(int index):获取指定位置的元素

    • indexOf(Object o):返回指定元素第一次出现的索引
    • lastIndexOf(Object o):返回指定元素最后一次出现的索引
  • 修改元素: - set(int index, E element):替换指定位置的元素

  • 删除元素: - remove(int index):删除指定位置的元素

    • remove(Object o):删除指定元素的第一个匹配项
  • 其他方法: - size():返回列表大小

    • isEmpty():判断列表是否为空
    • `subList(int fr
// 示例用法
List<String> list = new ArrayList<>();
list.add("item1");
list.add(0, "item2"); // 在指定位置插入
Set 接口
  • 特点:不允许重复元素的集合
  • 主要实现类
    • HashSet: 基于哈希表实现,无序且快速查找
    • LinkedHashSet: 保持插入顺序的 HashSet
    • TreeSet: 基于红黑树实现,排序集合

主要方法:

  • 添加元素

    • add(E e):添加元素,如果集合中已存在该元素则返回false
  • 删除元素

    • remove(Object o):删除指定元素
  • 批量操作

    • addAll(Collection<? extends E> c):添加集合中的所有元素
    • removeAll(Collection<?> c):删除集合中包含的所有元素
    • retainAll(Collection<?> c):只保留集合中包含的元素
  • 查询操作

    • contains(Object o):检查是否包含指定元素
    • size():返回集合大小
    • isEmpty():判断集合是否为空
// 示例用法
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
Queue 接口
  • 特点:队列,通常按照先进先出(FIFO)原则排序
  • 主要实现类
    • LinkedList: 实现了 Queue 接口
    • PriorityQueue: 基于堆的优先级队列
    • ArrayDeque: 双端队列实现

主要方法:

  • 添加元素

    • add(E e):添加元素,如果队列满则抛出异常
    • offer(E e):添加元素,如果队列满则返回false
  • 移除元素

    • remove():移除并返回队首元素,如果队列空则抛出异常
    • poll():移除并返回队首元素,如果队列空则返回null
  • 检查元素

    • element():返回队首元素但不移除,如果队列空则抛出异常
    • peek():返回队首元素但不移除,如果队列空则返回null
// 示例用法
Queue<String> queue = new LinkedList<>();
queue.offer("first");
String item = queue.poll(); // 移除并返回头部元素

2. Map 接口

  • 注意:不继承自 Collection 接口
  • 特点:键值对映射关系,键唯一
  • 主要实现类
    • HashMap: 哈希表实现,允许null键和值
    • LinkedHashMap: 保持插入顺序的 HashMap
    • TreeMap: 基于红黑树的排序Map
    • Hashtable: 同步版本,不推荐使用
    • ConcurrentHashMap: 线程安全的HashMap替代品

主要方法:

  • 添加/替换映射

    • put(K key, V value):添加键值对
    • putAll(Map<? extends K, ? extends V> m):复制所有映射
    • putIfAbsent(K key, V value):如果键不存在则添加
  • 查询操作

    • get(Object key):根据键获取值
    • getOrDefault(Object key, V defaultValue):获取值,如果键不存在则返回默认值
    • containsKey(Object key):检查是否包含指定键
    • containsValue(Object value):检查是否包含指定值
  • 删除操作

    • remove(Object key):根据键删除映射
    • remove(Object key, Object value):只有当键值匹配时才删除
  • 视图方法

    • keySet():返回键的Set视图
    • values():返回值的Collection视图
    • entrySet():返回键值对的Set视图
  • 其他方法

    • size():返回映射数量
    • isEmpty():判断映射是否为空
    • clear():清空所有映射
// 示例用法
Map<String, Integer> map = new HashMap<>();
map.put("key", 1);
Integer value = map.get("key");

特殊用途集合

并发集合 (java.util.concurrent)

  • CopyOnWriteArrayList: 写时复制的线程安全List
  • ConcurrentLinkedQueue: 高性能并发队列
  • BlockingQueue: 支持阻塞操作的队列接口及其实现

工具类

  • Collections: 提供静态方法操作或返回集合
  • Arrays: 操作数组的工具类,可转为List

性能对比与选择建议

集合类型查找效率插入/删除效率是否有序允许重复线程安全
ArrayListO(n)O(n)
LinkedListO(n)O(1)
HashSetO(1)O(1)
TreeSetO(log n)O(log n)是(排序)
HashMapO(1)O(1)键否值是
TreeMapO(log n)O(log n)是(排序)键否值是

根据具体需求选择合适的集合类型可以显著提升程序性能。