作者:孙玉昌,昵称【逐个哥】,别的【壹壹哥】也是我哦
千锋教育高档教研员、CSDN博客专家、万粉博主、阿里云专家博主、优质作者
前言
截止到现在,壹哥现已把Java里的List、Set和Map这三大调集都给咱们解说结束了,不知道各位把握了多少呢?假如你对之前的内容还没有熟练把握,能够把壹哥前面的文章再多读几遍。假如你现已把握的很好了,那就继续阅读今日的内容吧。今日壹哥会再用一篇文章,把调集中遗漏的内容给咱们整理一下,比方Collection与Collections的差异。
——————————前戏已做完,精彩即开始—————————-
全文大约【3300】 字,不说废话,只讲能够让你学到技能、理解原理的纯干货!本文带有丰厚的案例及配图视频,让你更好地理解和运用文中的技能概念,并能够给你带来具有足够启迪的思考……
配套开源项目资料
Github:github.com/SunLtd/Lear…
Gitee:逐个哥/从零开始学Java
一. 常识回忆
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 逐个哥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里的几个常用办法哦。
别的假如你独自学习觉得有许多困难,能够加入壹哥的学习合作群,咱们一起交流学习。