带你了解Collections和Collection!!!

一、核心区别

Collection:是接口,Java 集合框架的根接口之一 ,定义了 List、Set、Queue 等单值集合的通用规范(存、取、删、遍历等)

Collections:是工具类,全是静态方法(意味着只需要调用即可,不需要创建对象),专门用来对 Collection 集合进行排序、查找、同步、不可变等便捷操作。

形象一点说:Collection是说明书,规定集合该有哪些功能;Collections是工具,给集合提供操作

可以用一张表来清晰的看出区别:

维度 Collection Collections
类型 接口(interface) 工具类(class)
继承 / 实现 继承 Iterable 接口 继承 Object,无实现集合接口
作用 定义 List/Set/Queue 的通用规范 提供集合操作的静态工具方法
实例化 不能实例化,需用实现类(ArrayList/HashSet) 不能实例化(构造私有),直接调用静态方法
使用方式 实现类对象调用方法 类名直接调用静态方法
核心场景 定义集合标准、面向接口编程 排序、查找、同步、不可变等便捷操作
所属体系 Java 集合框架的顶层接口 集合框架的工具类,独立于接口体系

二、Collection接口

1.继承体系

java.util.Collection 是 Java 集合框架的顶层父接口 ,继承了 Iterable 接口(意味着所有 Collection 集合都支持迭代遍历)。

它是List、Set、Queue 的父接口,但是需要注意的是Map不属于Collection,Map是双值集合(存储键值对),独立于Collection体系

完整继承结构如下:

复制代码
Iterable(迭代器接口)
  ↓
Collection(集合顶层接口)
  ├─ List(有序、可重复、索引访问)
  ├─ Set(无序、不可重复)
  └─ Queue(队列、先进先出)

2.核心作用

Collection 定义了所有单值集合必须实现的通用方法,统一了集合的操作规范。无论你用 ArrayList、HashSet 还是 LinkedList,都能通过 Collection 接口调用通用方法,实现面向接口编程。

3.常用方法

Collection没有提供实现类,而是定义了以下核心方法,由List、Set、Queue自行实现,常用实现类有:

  • List:ArrayList、LinkedList、Vector

  • Set:HashSet、LinkedHashSet、TreeSet

  • Queue:LinkedList、PriorityQueue

    // 添加元素
    boolean add(E e);
    // 批量添加
    boolean addAll(Collection<? extends E> c);
    // 删除指定元素
    boolean remove(Object o);
    // 判断是否包含
    boolean contains(Object o);
    // 清空集合
    void clear();
    // 获取元素个数
    int size();
    // 判断是否为空
    boolean isEmpty();
    // 转数组
    Object[] toArray();
    // 迭代器(遍历集合)
    Iterator iterator();

4.代码示例

Collection引用指向ArrayList实现类:

java 复制代码
import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();

        // 1. 添加元素
        collection.add("Java");
        collection.add("Python");
        collection.add("C++");
        System.out.println("添加后:" + collection); // [Java, Python, C++]

        // 2. 判断元素是否存在
        System.out.println("包含Java?" + collection.contains("Java")); // true

        // 3. 获取集合大小
        System.out.println("集合大小:" + collection.size()); // 3

        // 4. 移除元素
        collection.remove("C++");
        System.out.println("移除后:" + collection); // [Java, Python]

        // 5. 遍历集合(迭代器)
        for (String s : collection) {
            System.out.println("遍历元素:" + s);
        }

        // 6. 清空集合
        collection.clear();
        System.out.println("清空后是否为空:" + collection.isEmpty()); // true
    }
}

三、Collections工具类

1.定义与特点

java.util.Collections 是 Java 提供的集合工具类 ,构造方法私有(private Collections(){}),不能实例化 ,所有方法都是静态方法,直接通过类名调用。

它的核心作用:简化集合操作,提供原生集合没有的高级功能(排序、反转、查找、同步、不可变等)。

2.常用静态方法

(1)排序

这里的comparator之前有提到过哦!在lambda那篇文章里

java 复制代码
// 自然排序(元素必须实现Comparable)
Collections.sort(list);
// 自定义排序(传入Comparator)
Collections.sort(list, Comparator.comparing(...) );

(2)查找

java 复制代码
// 二分查找(必须先排序)
int index = Collections.binarySearch(list, key);
List<Integer> list = new ArrayList<>();
//获取最大值
Integer max = Collections.max(list); 
//获取最小值
Integer min = Collections.min(list);

(3)修改

java 复制代码
// 反转集合
Collections.reverse(list);
// 随机打乱
Collections.shuffle(list);
// 替换所有元素
Collections.fill(list, obj);
// 交换两个索引位置
Collections.swap(list, i, j);

(4)线程安全转换

Collection<T> synchronizedCollection(Collection<T> c):将非线程安全集合转为线程安全集合

List<T> synchronizedList(List<T> list):线程安全 List

Set<T> synchronizedSet(Set<T> s):线程安全 Set

3.代码示例

java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(30);
        list.add(10);
        list.add(20);
        list.add(50);
        System.out.println("原始集合:" + list); // [30, 10, 20, 50]

        // 1. 升序排序
        Collections.sort(list);
        System.out.println("排序后:" + list); // [10, 20, 30, 50]

        // 2. 反转集合
        Collections.reverse(list);
        System.out.println("反转后:" + list); // [50, 30, 20, 10]

        // 3. 获取最大/最小值
        System.out.println("最大值:" + Collections.max(list)); // 50
        System.out.println("最小值:" + Collections.min(list)); // 10

        // 4. 二分查找(需先排序)
        Collections.sort(list);
        System.out.println("查找20的索引:" + Collections.binarySearch(list, 20)); // 1

        // 5. 随机打乱
        Collections.shuffle(list);
        System.out.println("随机打乱后:" + list);

        // 6. 转为不可变集合(增删抛 UnsupportedOperationException)
        List<Integer> unmodifiableList = Collections.unmodifiableList(list);
        // unmodifiableList.add(60); // 运行报错

        // 7. 转为线程安全集合
        List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());
    }
}

四、常见误区

误区 1:把 Collections 当作集合使用:

错误:Collections list = new ArrayList();

正确:Collection list = new ArrayList();

误区 2:用 Collection 做排序 / 查找

Collection 接口没有排序方法 ,排序必须用 Collections.sort()。

误区 3:认为 Collections 是 Collection 的实现类

二者无继承关系,Collections 是独立的工具类,和 Collection 接口没有父子关系。

相关推荐
smallyoung2 小时前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga3 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff5 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3275 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar5 小时前
Java封装、继承、多态
java·开发语言
ly76895 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠5 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
奇牙coding6 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!6 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻6 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm