作者:孙玉昌,昵称【逐个哥】,别的【壹壹哥】也是我哦

千锋教育高档教研员、CSDN博客专家、万粉博主、阿里云专家博主、优质作者

前言

截止到现在,壹哥现已把Java里的List、Set和Map这三大调集都给咱们解说结束了,不知道各位把握了多少呢?假如你对之前的内容还没有熟练把握,能够把壹哥前面的文章再多读几遍。假如你现已把握的很好了,那就继续阅读今日的内容吧。今日壹哥会再用一篇文章,把调集中遗漏的内容给咱们整理一下,比方Collection与Collections的差异。

——————————前戏已做完,精彩即开始—————————-

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

配套开源项目资料

Github:github.com/SunLtd/Lear…

Gitee:逐个哥/从零开始学Java

一. 常识回忆

1. Java调集系统

依据壹哥前面给咱们解说的内容可知,Java的调集全体上能够分为 CollectionMap 两大系统,而从这两大系统中又能够延伸细分为 3个子类型:

  • List-列表
  • Set-集
  • Map-映射

从全体上来看,这几种调集之间的联系如下图所示:

从零开始学Java之面试常问Collection与Collections有什么区别?

2. 调集的联系图谱

别的调集的各个接口和类之间除了有共同之处,它们也有一些各自的特色,咱们能够看看下面这个调集的联系图谱:

从零开始学Java之面试常问Collection与Collections有什么区别?

在上图中,有3个中心API需要咱们把握:

  • Iterator: 咱们能够通过迭代器遍历调集中的数据;
  • Collection: Collection是List、Set、Queue 这3种调集的父级接口;
  • Map: Map是映射表的父级接口。

为了让咱们加深形象,接下来咱们再单独复习一下Collection接口是怎么回事。

二. Collection

1. 简介

Collection是Java调集结构中的一个接口,它界说了一组用于存储、拜访和操作方针的办法。它是Java调集结构中的根底接口之一,咱们常用的许多调集类都完成了Collection接口或其子接口(如List、Set、Queue等)。

从零开始学Java之面试常问Collection与Collections有什么区别?

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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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 逐个哥Sun
 */
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里的几个常用办法哦。

别的假如你独自学习觉得有许多困难,能够加入壹哥的学习合作群,咱们一起交流学习。