这是一个非常经典的Java面试题,它们虽然名字相似,但角色和功能完全不同。
核心概念
简单来说:
Collection
是一个接口,它是所有单列集合(如 List, Set)的顶级根接口之一。Collections
是一个工具类,它包含了大量静态方法,用于对Collection
接口的实现类(如ArrayList, HashSet等)进行各种操作。
1. Collection (接口)
角色: 它是Java集合框架中的一个根接口。
作用:
定义标准:它规定了所有单列集合(List, Set, Queue等)都应该具备的一些最基本、最通用的方法。例如:
add(E e)
:添加元素remove(Object o)
:移除元素size()
:获取集合大小iterator()
:获取迭代器,用于遍历集合contains(Object o)
:判断是否包含某个元素clear()
:清空集合
实现多态:你可以使用
Collection
接口类型来声明一个变量,然后用具体的实现类(如ArrayList
,HashSet
)来实例化它。这样做的好处是代码更通用,耦合度更低。
主要子接口:
List
: 有序、可重复的集合。Set
: 无序、不可重复的集合。Queue
: 队列集合。
如何使用:
// 使用Collection接口声明一个集合,用ArrayList实现
Collection<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
System.out.println(list.size()); // 输出: 2
// 同样可以用Collection接口声明,用HashSet实现
Collection<String> set = new HashSet<>();
set.add("Apple");
set.add("Apple"); // 重复元素不会被添加
System.out.println(set.size()); // 输出: 1
2. Collections (工具类)
角色: 它是一个工具类/辅助类。
作用:
提供算法:它包含了很多静态方法,为
Collection
接口的实现类提供各种有用的算法或功能。这些方法极大地便利了我们对集合的操作。操作集合:这些方法通常用于对集合进行排序、搜索、替换、同步化等操作。
常用方法:
排序:
sort(List<T> list)
- 对List集合进行自然排序。打乱:
shuffle(List<?> list)
- 随机打乱List集合中元素的顺序。搜索:
binarySearch(List<?> list, T key)
- 使用二分查找法在已排序的List中查找元素。极值:
max(Collection<?> coll)
,min(Collection<?> coll)
- 找出集合中的最大或最小值。反转:
reverse(List<?> list)
- 反转List中元素的顺序。线程安全:
synchronizedCollection(Collection<T> c)
- 将一个非线程安全的集合包装成线程安全的集合。不可变集合:
unmodifiableCollection(Collection<?> c)
- 返回一个不可修改的集合视图。
如何使用:
List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(2);
// 使用Collections工具类进行排序
Collections.sort(numbers);
System.out.println(numbers); // 输出: [1, 2, 3]
// 使用Collections工具类找出最大值
Integer max = Collections.max(numbers);
System.out.println(max); // 输出: 3
// 使用Collections工具类将集合变为线程安全的
Collection<Integer> syncNumbers = Collections.synchronizedCollection(numbers);
总结对比
特性Collection (接口)Collections (工具类)本质是一个接口是一个类用途定义集合的基本操作规范提供操作集合的静态工具方法方法类型包含需要被实现的抽象实例方法包含可以直接调用的静态方法功能代表一个集合对象本身代表对集合对象的一系列操作
一个简单的比喻来帮助理解:
Collection
就像是一份 “汽车设计图纸”,它规定了汽车应该有轮子、方向盘、发动机等基本部件。Collections
就像一个 “多功能修车工具箱”,里面有扳手、螺丝刀、千斤顶等工具,用来对造好的汽车(ArrayList
,HashSet
等)进行保养、维修、改装等操作。