首页 > 其他分享 >Collection与Collections有什么区别

Collection与Collections有什么区别

时间:2023-07-07 16:25:39浏览次数:25  
标签:java 区别 List list Collection util Collections 集合

**本文将为大家详细讲解Java中Collection与Collections的区别点,这是我们进行开发时经常用到的知识点,也是大家在学习Java中很重要的一个知识点,更是我们在面试时有可能会问到的问题!**

**文章较长,干货满满,建议大家收藏慢慢学习。文末有本文重点总结,主页有全系列文章分享。技术类问题,欢迎大家和我们一起交流讨论!**

@[TOC]
# 前言

截止到现在我们已经把 **Java里的[List]、[SET]和[Map]** 这三大集合都给大家讲解完毕了,不知道各位掌握了多少呢?如果你对之前的内容还没有熟练掌握,可以把前面的文章再多读几遍。如果你已经掌握的很好了,那就继续阅读今天的内容吧。今天会再用一篇文章,把集合中遗漏的内容给大家梳理一下,比如**Collection与Collections**的区别。

***

全文大约 **【3300】** 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...

# 一. 知识回顾

## 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<T> list)方法用于对List集合进行**升序排序**,例如:

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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<T> list)方法用于对List集合进行**反转排序**,例如:

```java
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<T> list)方法用于对List集合进行**随机排序**,例如:

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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()方法案例如下**:

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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<T> list, T oldVal, T newVal)方法用于**将List集合中所有的旧元素替换为新元素**,例如:

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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集合**,例如:

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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<T> c)** 方法用于将指定集合转换为线程安全的集合,例如:

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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<T> list)** 方法用于将指定的List集合转换为线程安全的List集合,例如:

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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<T> s)方法用于将指定的Set集合转换为线程安全的Set集合,例如:

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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集合,例如:

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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()`方法统计某个数据在集合中出现的次数。

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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()`方法后,目标集合中每个已复制元素的索引,将等同于源集合中该元素的索引。

```java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

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里的几个常用方法哦。

***

以上就是本文的全部内容啦,大家有技术类问题,欢迎和我们一起交流讨论\~

**更多技术类干货,关注我!**

我是专门分享技术干货的分享君!

视频配套资料[:戳这里](https://space.bilibili.com/146668655?spm_id_from=333.337.0.0)

标签:java,区别,List,list,Collection,util,Collections,集合
From: https://www.cnblogs.com/qian-fen/p/17535275.html

相关文章

  • Check&Review的区别
    在我们日常的GMP记录中,经常看见复核人或者审核人这样的字眼,那么二者到底有什么区别呢?日常我们又该如何做复核?如何做审核呢?“复核”,强调的是现场的第二人确认;而“审核”,强调的是非现场(或者事后)的再次审查。我们再来看下二个英文单词Check&Review的区别,Check meanslookingforac......
  • Unity学习--C#初级编程 Awake和Start、Update和FixedUpdate的区别
    1.Awake和Start相同点:对象的生命周期内只会调用一次不同点:Awake在脚本启用或未启用后均会调用,Start只会在脚本启用后调用Awake在Start前调用理解:AwakesetAmmofortheenemy,StartallowenemytoShoot2.Update和FixedUpdateUpdate:每帧调用(每帧处理时间不一......
  • XHTML与HTML5的区别
    最近在困惑html5和XHTML两者之间的具体区别,查看了百度、google和新浪等,他们首页的源码第一句都是<!Doctype html>这是HTML5的doctype声明,说明这些主流网站已经都普遍在运用HTML5了,因为HTML5不基于SGML(标准通用标记语言),所以不需要引用DTD(文档类型定义)。但是HTML5是一个还未......
  • #if、#else、#endif、#elif、#ifdef、#ifndef的区别和使用
    常用的条件编译#if,#elif,#else,#endif,#ifdef、#ifndef看名字就知道,跟我们平时用的if、elseif、else是一样的,不同的是这里一定要记得#endif。#if条件1代码1#elif条件2代码2#else代码段n+1#endif 意思跟我们平常写的代码一样......
  • k8s中role和clusterrole的区别?
    在Kubernetes(K8s)中,Role和ClusterRole的区别,可以简单概括如下: -Role(角色)是在命名空间级别定义的,仅适用于特定的命名空间。-ClusterRole(集群角色)是在整个集群级别定义的,适用于整个集群的所有命名空间。 具体来说: -Role用于控制对命名空间内资源的访问和操作权限......
  • 大端小端及区别方法
    理论大端模式:数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;小端模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址......
  • 【后端面经-计算机基础】HTTP和TCP的区别
    【后端面经-计算机基础】HTTP和TCP的区别目录【后端面经-计算机基础】HTTP和TCP的区别1.OSI七层模型和相关协议2.TCP协议2.1特点:2.2报文格式2.3三次握手和四次挥手3.HTTP协议3.1特点3.2报文格式3.2https和http4.HTTPvsTCP5.面试模拟参考资料1.OSI七层模型和相关协......
  • Oracle update和 for update的区别
    两者都可以对数据进行修改,不同点:update一般使用的是 update.....set....语句,这样看不到数据的详细信息。而for update一般使用的是select *from....for update。这样的话,是查询了数据的详细信息,然后附带查询功能。比如select*frommytablewheremycolumn=......
  • 使用了下chatgpt3.0和chatgpt4.0的区别
    chatgpt4.0的理解能力更强了以下地址即可试用  ......
  • OSI TCP/IP模型 数据包报帧区别(自用)
    OSI七层模型OSI(OpenSystemInterconnectionReferenceModel,开放式通信系统互联参考模型)TCP/IP五层模型TCP/IP模型将OSI模型的应用层,表示层,会话层合并成了应用层数据包,数据报,帧的区别数据包与帧帧:数据链路层的传输单位数据包:可能由几个帧组成,可能超过MTUM......