【java第54集】java Collection单列集合详解

文章目录

  • 一、Collection接口的核心概念
  • 二、Collection的核心方法
    • 1. 增加元素
    • 2. 删除元素
    • 3. 查询元素
    • 4. 遍历元素
    • 5. JDK 8 新增方法
  • 三、Collection的主要实现类对比
  • 四、典型使用场景与代码示例
    • 1. List 的使用(ArrayList vs LinkedList)
    • 2. Set 的使用(HashSet vs TreeSet)
    • 3. 队列操作(Queue)
  • 五、注意事项与最佳实践
    • 1. 线程安全问题
    • 2. 性能优化
    • 3. 键值对象的 `equals()` 和 `hashCode()`
    • 4. 遍历方式
  • 六、总结

一、Collection接口的核心概念

【java第54集】java Collection单列集合详解_第1张图片

Collection 是 Java 集合框架的根接口,定义了所有 单列集合 的通用操作。它表示一组对象(元素),支持增删查改等基本功能,适用于需要管理一组数据的场景。

集合框架的层级关系

  • 接口层级

    • Collection 接口是所有单列集合的基类。
    • 直接继承自 Collection 的主要有三个子接口:
      • List:有序、可重复,允许通过索引访问元素(如 ArrayListLinkedList)。
      • Set:无序、不可重复(如 HashSetTreeSet)。
      • Queue/Deque:支持先进先出(FIFO)或后进先出(LIFO)的队列结构(如 PriorityQueueLinkedList)。
  • 实现类特点

    • List:动态数组(ArrayList)或链表(LinkedList)。
    • Set:基于哈希表(HashSet)或红黑树(TreeSet)。
    • Queue:优先队列(PriorityQueue)或双端队列(LinkedList)。

二、Collection的核心方法

Collection 接口定义了所有集合的通用操作方法,以下是关键方法及示例:

1. 增加元素

  • boolean add(E e)
    添加单个元素。

    List<String> list = new ArrayList<>();
    list.add("Apple"); // 添加元素
    
  • boolean addAll(Collection c)
    添加另一个集合的所有元素。

    List<String> list1 = new ArrayList<>();
    list1.add("Banana");
    list.addAll(list1); // 添加 list1 的所有元素
    

2. 删除元素

  • void clear()
    清空所有元素。

    list.clear(); // list 变为空集合
    
  • boolean remove(Object o)
    删除第一个匹配的元素。

    list.remove("Apple"); // 删除 "Apple"
    
  • boolean removeAll(Collection c)
    删除当前集合中与指定集合共有的元素(差集)。

    list.removeAll(list1); // 删除 list1 中的所有元素
    
  • boolean retainAll(Collection c)
    仅保留当前集合与指定集合共有的元素(交集)。

    list.retainAll(list1); // 保留 list1 中的元素
    

3. 查询元素

  • int size()
    返回集合大小。

    System.out.println(list.size()); // 输出元素数量
    
  • boolean isEmpty()
    判断集合是否为空。

    System.out.println(list.isEmpty()); // 输出 true 或 false
    
  • boolean contains(Object o)
    判断是否包含指定元素。

    System.out.println(list.contains("Apple")); // 输出 true 或 false
    
  • boolean containsAll(Collection c)
    判断是否包含指定集合的所有元素。

    System.out.println(list.containsAll(list1)); // 输出 true 或 false
    

4. 遍历元素

  • Iterator iterator()
    返回迭代器,用于遍历集合。

    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
    
  • Object[] toArray()
    转换为数组。

    Object[] array = list.toArray();
    

5. JDK 8 新增方法

  • boolean removeIf(Predicate filter)
    根据条件删除元素。
    list.removeIf(s -> s.startsWith("A")); // 删除以 "A" 开头的元素
    

三、Collection的主要实现类对比

实现类 底层结构 特点 适用场景
ArrayList 动态数组 随机访问快(O(1)),中间插入/删除慢(O(n))。 需要频繁随机访问的场景。
LinkedList 双向链表 插入/删除快(O(1)),随机访问慢(O(n))。 需要频繁增删的场景(如队列)。
HashSet 哈希表 无序、不可重复,添加/查询效率高(O(1))。 需要快速查找且不重复的场景。
TreeSet 红黑树 自然排序或自定义排序(O(log n)),不允许 null 需要排序的场景(如排行榜)。
LinkedHashSet 哈希表 + 双向链表 保持插入顺序,性能接近 HashSet 需要遍历顺序的场景(如缓存)。
Vector 动态数组(线程安全) 线程安全但性能较低,扩容时翻倍。 多线程环境(推荐用 CopyOnWriteArrayList)。
Stack 继承 Vector 后进先出(LIFO),适合栈操作。 实现栈功能(Deque 更推荐)。

四、典型使用场景与代码示例

1. List 的使用(ArrayList vs LinkedList)

// ArrayList:适合随机访问
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
System.out.println(fruits.get(0)); // 快速访问

// LinkedList:适合频繁增删
List<String> queue = new LinkedList<>();
queue.addFirst("A");
queue.addLast("B");
System.out.println(queue.removeFirst()); // 快速删除

2. Set 的使用(HashSet vs TreeSet)

// HashSet:去重
Set<String> uniqueWords = new HashSet<>();
uniqueWords.add("Java");
uniqueWords.add("Java"); // 无效,返回 false
System.out.println(uniqueWords); // [Java]

// TreeSet:排序
Set<Integer> sortedNumbers = new TreeSet<>();
sortedNumbers.add(3);
sortedNumbers.add(1);
System.out.println(sortedNumbers); // [1, 3]

3. 队列操作(Queue)

Queue<String> messages = new LinkedList<>();
messages.offer("Msg1"); // 入队
messages.offer("Msg2");
System.out.println(messages.poll()); // 出队,输出 "Msg1"

五、注意事项与最佳实践

1. 线程安全问题

  • 默认实现(如 ArrayListHashSet非线程安全
  • 多线程环境下需使用:
    • Collections.synchronizedList(new ArrayList<>())
    • CopyOnWriteArrayList(读多写少)
    • ConcurrentHashMap(替代 Hashtable

2. 性能优化

  • 初始容量:合理设置 ArrayListHashMap 的初始容量,减少扩容开销。
  • 遍历安全:遍历时修改集合会抛出 ConcurrentModificationException,需使用迭代器的 remove() 方法。

3. 键值对象的 equals()hashCode()

  • 若自定义类作为集合元素(如 SetHashMap 的键),必须重写 equals()hashCode() 方法,确保逻辑正确性。

4. 遍历方式

  • 迭代器(推荐):支持安全删除元素。
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String s = it.next();
        if (s.equals("Apple")) it.remove(); // 安全删除
    }
    
  • 增强型 for 循环:不支持修改集合。
    for (String s : list) {
        System.out.println(s);
    }
    

六、总结

  • Collection 是 Java 集合框架的基石,通过 ListSetQueue 等子接口满足不同的数据管理需求。
  • 选择实现类时需权衡性能与功能
    • ListArrayList(随机访问)、LinkedList(频繁增删)。
    • SetHashSet(去重)、TreeSet(排序)。
    • QueueLinkedList(双端队列)、PriorityQueue(优先级队列)。
  • 掌握核心方法(如 addremoveiterator)和遍历技巧,能高效处理集合数据。
  • 注意线程安全和性能优化,避免常见错误(如并发修改异常)。

你可能感兴趣的:(java基础,java,开发语言)