首页 > 编程语言 >Java中Collection与Collections有什么区别?Java常见面试题解析

Java中Collection与Collections有什么区别?Java常见面试题解析

时间:2023-05-29 10:22:37浏览次数:55  
标签:面试题 Java List list Collection util Collections 集合 java

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

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

前言

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


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

一. 知识回顾

1. Java集合体系

根据前面给大家讲解的内容可知,Java的集合整体上可以分为 CollectionMap 两大体系,而从这两大体系中又可以延伸细分为 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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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的区别

综上所述,就可以把CollectionCollections的区别给大家总结出来了。CollectionCollections虽然名字很相似,但它们的作用和用法完全不同,其核心区别如下:

Collection是Java集合框架中的一个接口,定义了一组用于存储、访问和操作对象的方法,它是所有集合类的基础接口之一;

Collections是Java集合框架中的一个工具类,提供了一系列的静态方法,方便我们对集合进行排序、查找、替换等操作,它是一个类,而不是一个接口。

简单来说,Collection是一个接口,是Java集合框架中的基础接口之一;而Collections是一个工具类,提供了一系列静态方法,用于对集合进行高级操作。


四. 结语

至此,就把今天的内容讲解完毕了,我相信大家也已经明白了CollectionCollections的区别了。那么今天的核心内容,就是下面这些了:

Collection是Java集合的基础接口,List、Set等都继承自该接口;

Collections是操作集合的工具类,里面有若干个操作集合的方法;

你要熟练使用Collections里的几个常用方法哦。


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

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

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

视频配套资料:戳这里

标签:面试题,Java,List,list,Collection,util,Collections,集合,java
From: https://www.cnblogs.com/qian-fen/p/17439677.html

相关文章

  • JavaScript函数传参原理详解——值传递还是引用传递
    讨论JavaScript的传参原理之前,我们先来看一段曾经让笔者困惑了一段时间的代码vartestA=1;vartestB={};functiontestNumber(example){example=2;}functiontestObj(example){example.test=1;}testNumber(testA);testObj(testB);console.log(testA);//......
  • java多线程
    java多线程进程、线程与多线程进程是执行程序的一次执行过程,是一个动态的概念,是系统支援分配的单位通常一个进程可以包含一个或多个线程。线程是CPU调度和执行的单位线程就是独立执行的路径,由cpu调度线程会带来额外的开销,如cpu调度时间,并发控制开销每个线程在自己......
  • 复习JavaDay08
    GUI编程简介Gui的核心技术:SwingAWT1.因为界面不美观2.需要jre环境!为什么我们要学习?1.可以写出自己心中想要的一些小工具2.工作时候,也可能需要维护到swing界面,概率极小!3.了解MVC架构,了解监听!第一个Frame窗口publicstaticvoidmain(String[]args){ //创建一个图......
  • Java 线程
    栈与栈帧JavaVirtualMachineStacks(Java虚拟机栈)每个线程启动后,虚拟机就会为其分配一块栈内存,是线程私有的。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存;每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。  线程上下文切换(ThreadContext......
  • Java的Object类的方法
    Java的Object类是所有类的根类,它提供了一些通用的方法。下面是一些常用的Object类方法:1.equals(Objectobj):判断当前对象是否与给定对象相等。默认情况下,equals方法比较的是对象的引用,但可以通过在具体类中重写equals方法来改变其比较行为。2.hashCode():返回当前对象的哈希码......
  • 基于JAVA的springboot+vue摄影跟拍预定管理系统,附源码+数据库+论文+PPT
    1、项目介绍困扰管理层的许多问题当中,摄影跟拍预定管理一定是不敢忽视的一块。但是管理好摄影跟拍预定又面临很多麻烦需要解决,例如有几个方面:第一,往往用户人数都比较多,如何保证能够管理到每一用户;第二,如何在工作琐碎,记录繁多的情况下将摄影跟拍预定的当前情况反应给领导......
  • 树的最大深度-java实现
    使用递归的方法最为简洁、高效;通过主次遍历,主要不为空,书的深度就加一,同时比较右侧树的深度,每次返回最大值; 1publicintmaxDepth(TreeNoderoot){2returnroot==null?0:Math.max(maxDepth(root.left)+1,maxDepth(root.right)+1);3}ViewCode ......
  • 深入理解 Java 虚拟机 —— Java 内存模型与线程
    处理器的效率和一致性(与java内存访问可类比)计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处......
  • Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联
     Vo:/***用来返回给前端展示列表的数据实体*/@DatapublicclassCourseVoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringid;privateStringtitle;privateStringsubjectParentTitle;private......
  • java全局配置
    <settings><settingname="mapUnderscoreToCamelCase"value="true"/><settingname="cacheEnabled"value="true"/></settings><typeAliases><!--<typeA......