Java集合

Java集合框架是Java编程中用于存储和操作一组数据的工具,它提供了丰富的接口和实现类,以支持不同类型的数据结构需求。

一、集合框架概述

Java集合框架(Java Collections Framework, JCF)是一套系统类库,用于统一管理对象的存储、查询和操作。其核心特点包括统一的接口设计、高效的实现类以及灵活的数据结构支持。在Java 2之前,已有特设类如Vector、Stack等,但集合框架通过标准化接口(如Collection、Map)进一步提升了代码的可复用性和一致性。

二、主要集合类型

集合框架主要分为两大类:单列集合(Collection)和双列集合(Map)。其中,Collection接口是所有单列集合的根接口,其子接口包括List、Set和Queue:

  1. List:有序且可重复的集合,常见实现类有ArrayList和Vector。ArrayList基于数组实现,查询快但增删慢,线程不安全;Vector与ArrayList类似,但线程安全,效率较低。
  2. Set:无序且不可重复的集合,如HashSet和TreeSet,适用于需要唯一性约束的场景。
  3. Queue:队列结构,支持先进先出(FIFO)操作,常用于任务调度等场景。

Java集合框架主要围绕两大根接口展开:CollectionMap

1. Collection 接口(单列集合)

Collection 是所有单列集合的父接口,定义了集合的基本操作,如添加、删除、遍历等。它有三个主要子接口:

接口 特点 常见实现类
List 有序、可重复 ArrayList, LinkedList, Vector
Set 无序、不可重复 HashSet, TreeSet, LinkedHashSet
Queue 队列(先进先出) PriorityQueue, LinkedList

2. Map 接口(双列集合)

Map 用于存储"键值对"映射,每个键唯一,值可重复。

实现类 特点
HashMap 基于哈希表,无序,线程不安全
TreeMap 基于红黑树,按自然顺序或自定义排序
LinkedHashMap 保持插入顺序
Hashtable 线程安全,但性能较差
ConcurrentHashMap 线程安全,高并发性能好

三、常用集合实现类详解

1. ArrayList

  • 底层数据结构:动态数组

  • 特点

    • 查询快(O(1))
    • 增删慢(需移动元素)
    • 非线程安全
  • 适用场景:频繁查询、较少增删

    List<String> list = new ArrayList<>();
    list.add("Java");
    list.add("Python");
    System.out.println(list.get(0)); // 输出: Java

2. LinkedList

  • 底层数据结构:双向链表

  • 特点

    • 增删快(O(1))
    • 查询慢(需遍历)
    • 实现了 Queue 接口,可作为队列使用
  • 适用场景:频繁增删

    List<String> list = new LinkedList<>();
    list.add("A");
    list.add("B");
    list.remove(0);

3. HashSet

  • 底层数据结构:哈希表(基于 HashMap)

  • 特点

    • 无序
    • 元素唯一
    • 非线程安全
  • 适用场景:需要去重、不关心顺序

    Set<String> set = new HashSet<>();
    set.add("apple");
    set.add("banana");
    set.add("apple"); // 重复,不会添加

4. TreeSet

  • 底层数据结构:红黑树

  • 特点

    • 有序(自然排序或自定义排序)
    • 元素唯一
  • 适用场景:需要排序、去重

    Set<String> set = new TreeSet<>();
    set.add("Orange");
    set.add("Apple");
    System.out.println(set); // 输出: [Apple, Orange]

5. HashMap

  • 底层数据结构:数组 + 链表/红黑树(JDK8后)

  • 特点

    • 键唯一,值可重复
    • 无序
    • 非线程安全
  • 适用场景:高效存取键值对

    Map<String, Integer> map = new HashMap<>();
    map.put("张三", 18);
    map.put("李四", 20);
    System.out.println(map.get("张三")); // 输出: 18


四、集合的线程安全机制

Java集合中大部分实现类是非线程安全的,如 ArrayListHashMap。在多线程环境下,可采用以下方式保证线程安全:

方式 示例
使用同步包装类 List<String> list = Collections.synchronizedList(new ArrayList<>());
使用并发集合类 ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
使用 CopyOnWriteArrayList List<String> list = new CopyOnWriteArrayList<>();

五、集合遍历方式

1. for 循环

复制代码
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

2. 增强 for 循环(foreach)

复制代码
for (String item : list) {
    System.out.println(item);
}

3. Iterator 迭代器

复制代码
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

六、与数组的区别

集合与数组的主要差异体现在:

  • 数据类型:数组只能存储相同类型元素,而集合可以存储不同类型(通过泛型可约束类型)。
  • 灵活性:数组长度固定,集合长度动态可变;集合还提供了更丰富的操作方法(如排序、查找等)。

七、应用场景

集合框架广泛应用于数据管理、算法实现等场景。例如,ArrayList适合频繁查询的场景,而LinkedList更适合频繁增删的场景;Map接口(如HashMap)则用于键值对存储。

八、总结

集合类型 推荐使用场景
ArrayList 查询多、增删少
LinkedList 增删多、查询少
HashSet 去重、不关心顺序
TreeSet 去重、需要排序
HashMap 键值对存储、无序
LinkedHashMap 键值对存储、需保持插入顺序
ConcurrentHashMap 多线程环境下的键值对存储
相关推荐
哈喽姥爷2 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
啊?啊?2 小时前
18 从对象内存到函数调用:C++ 虚函数表原理(继承覆盖 / 动态绑定)+ 多态实战
开发语言·c++·多态原理
bkspiderx2 小时前
C++标准库:文件流类
开发语言·c++
siy23333 小时前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表
njxiejing3 小时前
Python NumPy安装、导入与入门
开发语言·python·numpy
Rhys..3 小时前
Python&Flask 使用 DBUtils 创建通用连接池
开发语言·python·mysql
土了个豆子的3 小时前
04.事件中心模块
开发语言·前端·visualstudio·单例模式·c#
老华带你飞4 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·vue.js·spring boot·考研·小程序·毕设·考研论坛平台小程序
CHEN5_024 小时前
leetcode-hot100 11.盛水最多容器
java·算法·leetcode