Java中Collection与Collections的区别详解
作者:一一哥Sun
一. 知识回顾
1. Java集合体系
根据前面给大家讲解的内容可知,Java的集合整体上可以分为 Collection 和 Map 两大体系,而从这两大体系中又可以延伸细分为 3个子类型:
- List-列表
- Set-集
- Map-映射
从整体上来看,这几种集合之间的关系如下图所示:
2. 集合的关系图谱
另外集合的各个接口和类之间除了有共同之处,它们也有一些各自的特点,我们可以看看下面这个集合的关系图谱:
在上图中,有3个核心API需要我们掌握:
- Iterator: 我们可以通过迭代器遍历集合中的数据;
- Collection: Collection是List、Set、Queue 这3种集合的父级接口;
- Map: Map是映射表的父级接口。
为了让大家加深印象,接下来我们再单独复习一下Collection接口是怎么回事。
二. Collection
1. 简介
Collection是Java集合框架中的一个接口,它定义了一组用于存储、访问和操作对象的方法。它是Java集合框架中的基础接口之一,我们常用的很多集合类都实现了Collection接口或其子接口(如List、Set、Queue等)。
2. 核心方法
Collection接口中定义了一系列用于操作集合的通用核心方法,包括添加、删除、遍历、查找等,Collection的各个子类都需要实现这些方法。下面是一些常用的Collection接口方法:
- add(E e) :将元素e添加到集合中;
- remove(Object o) :从集合中删除对象o;
- contains(Object o) :判断集合中是否包含对象o;
- size() :返回集合中元素的个数;
- iterator() :返回集合中元素的迭代器。
通过这些方法,我们可以轻松地操作集合中的元素,实现各种常用的功能。
二. Collections
1. 简介
Collections是Java集合框架为了方便我们进行集合开发,为我们提供的一个 操作Set、List和Map等集合的 工具类, 位于java.util包中 。该类提供了一系列的静态方法,可以实现对集合进行排序、查找、替换、复制等操作。Collections类中的方法都是静态方法,不需要创建其对象即可使用。
利用Collections类,我们可以对集合进行一些高级的操作,比如对集合进行排序、查找最大值、查找最小值等。总之,Collections类中提供的方法,可以帮助我们简化代码,提高开发效率。
2. 常用方法
Collections类中为我们提供的方法其实有很多,大致可以分为以下几类:
- 创建空白集合: emptyList()、emptyMap()、emptySet():返回对应的不可变的空集合,无法向其中添加或删除元素;
- 创建单个元素的集合:singletonList(T o)、singletonMap(K key, V value)、singleton(T o):返回的是不可变的单元素集合,无法向其中添加或删除元素;
- 排序方法:sort、reverse、shuffle、swap、rotate;
- 查找方法:binarySearch;
- 替换方法:replaceAll、fill;
- 复制方法:copy;
- 同步方法:synchronizedCollection、synchronizedList、synchronizedMap等;
- 不可修改方法:unmodifiableCollection、unmodifiableList、unmodifiableMap等;
- 其他方法:frequency、max、min、disjoint、frequency、indexOfSubList、lastIndexOfSubList等。
接下来就通过几个案例,来教大家学会这些方法该如何使用。
3. 基本使用
3.1 排序方法
Collections类给我们提供了好几个排序方法,比如sort()、reverse()、shuffle() 等,用于对集合进行排序。
3.1.1 sort方法
sort(List list)方法用于对List集合进行升序排序,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo19 { public static void main(String[] args) { //Collections的使用--排序方法 List<Integer> list = new ArrayList<>(); list.add(3); list.add(1); list.add(2); //调用Collections的sort()排序方法---升序 Collections.sort(list); System.out.println(list); // [1, 2, 3] } }
3.1.2 reverse方法
reverse(List list)方法用于对List集合进行反转排序,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo19 { public static void main(String[] args) { //Collections的使用--排序方法 //调用Collections的reverse()排序方法--反转排序 List<Integer> list2 = new ArrayList<>(); list2.add(1); list2.add(2); list2.add(3); Collections.reverse(list2); System.out.println(list2); // [3, 2, 1] } }
3.1.3 shuffle方法
shuffle(List list)方法用于对List集合进行随机排序,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo19 { public static void main(String[] args) { //Collections的使用--排序方法 //调用Collections的shuffle()排序方法--随机 List<Integer> list3 = new ArrayList<>(); list3.add(1); list3.add(2); list3.add(3); Collections.shuffle(list3); System.out.println(list3); // [2, 1, 3] } }
3.2 查找方法
Collections类也给我们提供了用于对集合进行二分查找的binarySearch(List<? extends Comparable<? super T>> list, T key) 方法,该方法用于在有序集合中根据二分查找法,来查找到指定的元素,并返回元素在集合中的索引。如果指定元素不在集合中,则返回一个负数,表示应该插入该元素的位置。binarySearch()方法案例如下:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo20 { public static void main(String[] args) { //Collections的使用--查找方法 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //二分查找 int index = Collections.binarySearch(list, 2); System.out.println(index); // 1 } }
3.3 替换方法
Collections类给我们提供了一些用于替换的方法,比如replaceAll()、fill(),用于对集合进行替换。
3.3.1 replaceAll()方法
replaceAll(List list, T oldVal, T newVal)方法用于将List集合中所有的旧元素替换为新元素,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author */ public class Demo21 { public static void main(String[] args) { //Collections的使用--替换方法 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //替换方法 Collections.replaceAll(list, 2, 4); System.out.println(list); // [1, 4, 3] } }
3.3.2 fill()方法
fill(List<? super T> list, T obj)方法用于用指定元素填充List集合,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author */ public class Demo21 { public static void main(String[] args) { //Collections的使用--替换方法 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //指定元素填充List集合 Collections.fill(list, 0); System.out.println(list); // [0, 0, 0] } }
3.4 同步方法
Collections类提供了一些同步方法,如synchronizedCollection()、synchronizedList()、synchronizedMap()等,用于对集合进行同步处理,这可以保证多线程环境下的并发安全。
3.4.1 synchronizedCollection方法
synchronizedCollection(Collection c)方法用于将指定集合转换为线程安全的集合,例如:
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo22 { public static void main(String[] args) { //Collections的使用--同步方法 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //将指定集合转换为线程安全的集合 Collection<Integer> synchronizedList = Collections.synchronizedCollection(list); System.out.println("list="+synchronizedList); } }
3.4.2 synchronizedList方法
synchronizedList(List list)方法用于将指定的List集合转换为线程安全的List集合,例如:
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo22 { public static void main(String[] args) { //Collections的使用--同步方法 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //将指定的List集合转换为线程安全的List集合 List<Integer> synchronizedList = Collections.synchronizedList(list); System.out.println("list2="+synchronizedList); } }
3.4.3 synchronizedSet方法
synchronizedSet(Set s)方法用于将指定的Set集合转换为线程安全的Set集合,例如:
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo22 { public static void main(String[] args) { //Collections的使用--同步方法 Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(3); //将指定的Set集合转换为线程安全的Set集合 Set<Integer> synchronizedSet = Collections.synchronizedSet(set); System.out.println("set="+synchronizedSet); } }
3.4.4 synchronizedMap方法
synchronizedMap(Map<K,V> m)方法用于将指定的Map集合转换为线程安全的Map集合,例如:
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo22 { public static void main(String[] args) { //Collections的使用--同步方法 Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2); map.put("c", 3); //将指定的Map集合转换为线程安全的Map集合 Map<String, Integer> synchronizedMap = Collections.synchronizedMap(map); System.out.println("map="+synchronizedMap); } }
3.5 其他方法
我们可以使用max()和min()方法分别输出集合中的最大和最小值,用frequency()方法统计某个数据在集合中出现的次数。
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo23 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(100); list.add(-2); list.add(88); list.add(88); //查找集合中的最大值 System.out.println("max="+Collections.max(list)); //查找集合中的最小值 System.out.println("min="+Collections.min(list)); //判断88在List集合中出现的次数,返回2 System.out.println(Collections.frequency(list, 88)); } }
我们也可以使用Collections的copy()静态方法,将指定集合中的所有元素复制到另一个集合中。执行copy()方法后,目标集合中每个已复制元素的索引,将等同于源集合中该元素的索引。
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author */ public class Demo23 { public static void main(String[] args) { List<Integer> srcList = new ArrayList<>(); srcList.add(10); srcList.add(88); srcList.add(100); List<Integer> destList = new ArrayList<>(); destList.add(-1); destList.add(0); destList.add(1); //调用copy()方法,将srcList集合中的元素复制到destList集合中 // java.lang.IndexOutOfBoundsException: Source does not fit in dest //destList表示目标集合对象,srcList表示源集合对象。 Collections.copy(destList, srcList); System.out.println(destList); } }
我们要注意:目标集合的长度至少要和源集合的长度相同。如果目标集合的长度更长,则不影响目标集合中的其余元素。如果目标集合的长度不够而无法包含整个源集合元素,程序会抛出 IndexOutOfBoundsException异常。
除了以上这些方法,还有其他的一些方法,比如将一个集合变成不可变的集合,用于对集合进行保护等,就不再一一给大家展示其用法了。这些方法基本上就是见名知意,大家根据名称调用就可以,非常的简单。总之,希望大家可以熟练掌握Collections类的使用方法,这对于Java开发人员来说是非常重要的。
三. Collection与Collections的区别
综上所述,就可以把Collection与Collections的区别给大家总结出来了。Collection和Collections虽然名字很相似,但它们的作用和用法完全不同,其核心区别如下:
- Collection是Java集合框架中的一个接口,定义了一组用于存储、访问和操作对象的方法,它是所有集合类的基础接口之一;
- Collections是Java集合框架中的一个工具类,提供了一系列的静态方法,方便我摸对集合进行排序、查找、替换等操作,它是一个类,而不是一个接口。
简单来说,Collection是一个接口,是Java集合框架中的基础接口之一;而Collections是一个工具类,提供了一系列静态方法,用于对集合进行高级操作。
四. 结语
至此,就把今天的内容讲解完毕了,我相信大家也已经明白了Collection与Collections的区别了。那么今天的核心内容,就是下面这些了:
- Collection是Java集合的基础接口,List、Set等都继承自该接口;
- Collections是操作集合的工具类,里面有若干个操作集合的方法;
- 你要熟练使用Collections里的几个常用方法哦。
以上就是Java中Collection与Collections的区别详解的详细内容,更多关于Java Collection与Collections区别的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- java.util.Collections类—emptyList()方法的使用
- 浅谈Java中Collections.sort对List排序的两种方法
- Java使用Collections.sort()排序的方法
- java安全之CommonsCollections4详解
- Java中的Collections类的使用示例详解
- Java中Collections.sort的使用
- Java的可变参数与Collections类的功能示例解析
- Java Collection和Collections的区别
- Java中的集合工具类Collections详解
- Java中Collections.sort()排序方法举例详解
- Java中Collection和Collections的区别