Java中Collection與Collections的區(qū)別詳解
一. 知識(shí)回顧
1. Java集合體系
根據(jù)前面給大家講解的內(nèi)容可知,Java的集合整體上可以分為 Collection 和 Map 兩大體系,而從這兩大體系中又可以延伸細(xì)分為 3個(gè)子類(lèi)型:
- List-列表
- Set-集
- Map-映射
從整體上來(lái)看,這幾種集合之間的關(guān)系如下圖所示:
2. 集合的關(guān)系圖譜
另外集合的各個(gè)接口和類(lèi)之間除了有共同之處,它們也有一些各自的特點(diǎn),我們可以看看下面這個(gè)集合的關(guān)系圖譜:
在上圖中,有3個(gè)核心API需要我們掌握:
- Iterator: 我們可以通過(guò)迭代器遍歷集合中的數(shù)據(jù);
- Collection: Collection是List、Set、Queue 這3種集合的父級(jí)接口;
- Map: Map是映射表的父級(jí)接口。
為了讓大家加深印象,接下來(lái)我們?cè)賳为?dú)復(fù)習(xí)一下Collection接口是怎么回事。
二. Collection
1. 簡(jiǎn)介
Collection是Java集合框架中的一個(gè)接口,它定義了一組用于存儲(chǔ)、訪問(wèn)和操作對(duì)象的方法。它是Java集合框架中的基礎(chǔ)接口之一,我們常用的很多集合類(lèi)都實(shí)現(xiàn)了Collection接口或其子接口(如List、Set、Queue等)。
2. 核心方法
Collection接口中定義了一系列用于操作集合的通用核心方法,包括添加、刪除、遍歷、查找等,Collection的各個(gè)子類(lèi)都需要實(shí)現(xiàn)這些方法。下面是一些常用的Collection接口方法:
- add(E e) :將元素e添加到集合中;
- remove(Object o) :從集合中刪除對(duì)象o;
- contains(Object o) :判斷集合中是否包含對(duì)象o;
- size() :返回集合中元素的個(gè)數(shù);
- iterator() :返回集合中元素的迭代器。
通過(guò)這些方法,我們可以輕松地操作集合中的元素,實(shí)現(xiàn)各種常用的功能。
二. Collections
1. 簡(jiǎn)介
Collections是Java集合框架為了方便我們進(jìn)行集合開(kāi)發(fā),為我們提供的一個(gè) 操作Set、List和Map等集合的 工具類(lèi), 位于java.util包中 。該類(lèi)提供了一系列的靜態(tài)方法,可以實(shí)現(xiàn)對(duì)集合進(jìn)行排序、查找、替換、復(fù)制等操作。Collections類(lèi)中的方法都是靜態(tài)方法,不需要?jiǎng)?chuàng)建其對(duì)象即可使用。
利用Collections類(lèi),我們可以對(duì)集合進(jìn)行一些高級(jí)的操作,比如對(duì)集合進(jìn)行排序、查找最大值、查找最小值等??傊?,Collections類(lèi)中提供的方法,可以幫助我們簡(jiǎn)化代碼,提高開(kāi)發(fā)效率。
2. 常用方法
Collections類(lèi)中為我們提供的方法其實(shí)有很多,大致可以分為以下幾類(lèi):
- 創(chuàng)建空白集合: emptyList()、emptyMap()、emptySet():返回對(duì)應(yīng)的不可變的空集合,無(wú)法向其中添加或刪除元素;
- 創(chuàng)建單個(gè)元素的集合:singletonList(T o)、singletonMap(K key, V value)、singleton(T o):返回的是不可變的單元素集合,無(wú)法向其中添加或刪除元素;
- 排序方法:sort、reverse、shuffle、swap、rotate;
- 查找方法:binarySearch;
- 替換方法:replaceAll、fill;
- 復(fù)制方法:copy;
- 同步方法:synchronizedCollection、synchronizedList、synchronizedMap等;
- 不可修改方法:unmodifiableCollection、unmodifiableList、unmodifiableMap等;
- 其他方法:frequency、max、min、disjoint、frequency、indexOfSubList、lastIndexOfSubList等。
接下來(lái)就通過(guò)幾個(gè)案例,來(lái)教大家學(xué)會(huì)這些方法該如何使用。
3. 基本使用
3.1 排序方法
Collections類(lèi)給我們提供了好幾個(gè)排序方法,比如sort()、reverse()、shuffle() 等,用于對(duì)集合進(jìn)行排序。
3.1.1 sort方法
sort(List list)方法用于對(duì)List集合進(jìn)行升序排序,例如:
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); //調(diào)用Collections的sort()排序方法---升序 Collections.sort(list); System.out.println(list); // [1, 2, 3] } }
3.1.2 reverse方法
reverse(List list)方法用于對(duì)List集合進(jìn)行反轉(zhuǎn)排序,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo19 { public static void main(String[] args) { //Collections的使用--排序方法 //調(diào)用Collections的reverse()排序方法--反轉(zhuǎn)排序 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)方法用于對(duì)List集合進(jìn)行隨機(jī)排序,例如:
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 一一哥Sun */ public class Demo19 { public static void main(String[] args) { //Collections的使用--排序方法 //調(diào)用Collections的shuffle()排序方法--隨機(jī) 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類(lèi)也給我們提供了用于對(duì)集合進(jìn)行二分查找的binarySearch(List<? extends Comparable<? super T>> list, T key) 方法,該方法用于在有序集合中根據(jù)二分查找法,來(lái)查找到指定的元素,并返回元素在集合中的索引。如果指定元素不在集合中,則返回一個(gè)負(fù)數(shù),表示應(yīng)該插入該元素的位置。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類(lèi)給我們提供了一些用于替換的方法,比如replaceAll()、fill(),用于對(duì)集合進(jìn)行替換。
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類(lèi)提供了一些同步方法,如synchronizedCollection()、synchronizedList()、synchronizedMap()等,用于對(duì)集合進(jìn)行同步處理,這可以保證多線程環(huán)境下的并發(fā)安全。
3.4.1 synchronizedCollection方法
synchronizedCollection(Collection c)方法用于將指定集合轉(zhuǎn)換為線程安全的集合,例如:
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); //將指定集合轉(zhuǎn)換為線程安全的集合 Collection<Integer> synchronizedList = Collections.synchronizedCollection(list); System.out.println("list="+synchronizedList); } }
3.4.2 synchronizedList方法
synchronizedList(List list)方法用于將指定的List集合轉(zhuǎn)換為線程安全的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集合轉(zhuǎn)換為線程安全的List集合 List<Integer> synchronizedList = Collections.synchronizedList(list); System.out.println("list2="+synchronizedList); } }
3.4.3 synchronizedSet方法
synchronizedSet(Set s)方法用于將指定的Set集合轉(zhuǎn)換為線程安全的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集合轉(zhuǎn)換為線程安全的Set集合 Set<Integer> synchronizedSet = Collections.synchronizedSet(set); System.out.println("set="+synchronizedSet); } }
3.4.4 synchronizedMap方法
synchronizedMap(Map<K,V> m)方法用于將指定的Map集合轉(zhuǎn)換為線程安全的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集合轉(zhuǎn)換為線程安全的Map集合 Map<String, Integer> synchronizedMap = Collections.synchronizedMap(map); System.out.println("map="+synchronizedMap); } }
3.5 其他方法
我們可以使用max()和min()方法分別輸出集合中的最大和最小值,用frequency()方法統(tǒng)計(jì)某個(gè)數(shù)據(jù)在集合中出現(xiàn)的次數(shù)。
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集合中出現(xiàn)的次數(shù),返回2 System.out.println(Collections.frequency(list, 88)); } }
我們也可以使用Collections的copy()靜態(tài)方法,將指定集合中的所有元素復(fù)制到另一個(gè)集合中。執(zhí)行copy()方法后,目標(biāo)集合中每個(gè)已復(fù)制元素的索引,將等同于源集合中該元素的索引。
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); //調(diào)用copy()方法,將srcList集合中的元素復(fù)制到destList集合中 // java.lang.IndexOutOfBoundsException: Source does not fit in dest //destList表示目標(biāo)集合對(duì)象,srcList表示源集合對(duì)象。 Collections.copy(destList, srcList); System.out.println(destList); } }
我們要注意:目標(biāo)集合的長(zhǎng)度至少要和源集合的長(zhǎng)度相同。如果目標(biāo)集合的長(zhǎng)度更長(zhǎng),則不影響目標(biāo)集合中的其余元素。如果目標(biāo)集合的長(zhǎng)度不夠而無(wú)法包含整個(gè)源集合元素,程序會(huì)拋出 IndexOutOfBoundsException異常。
除了以上這些方法,還有其他的一些方法,比如將一個(gè)集合變成不可變的集合,用于對(duì)集合進(jìn)行保護(hù)等,就不再一一給大家展示其用法了。這些方法基本上就是見(jiàn)名知意,大家根據(jù)名稱(chēng)調(diào)用就可以,非常的簡(jiǎn)單??傊?,希望大家可以熟練掌握Collections類(lèi)的使用方法,這對(duì)于Java開(kāi)發(fā)人員來(lái)說(shuō)是非常重要的。
三. Collection與Collections的區(qū)別
綜上所述,就可以把Collection與Collections的區(qū)別給大家總結(jié)出來(lái)了。Collection和Collections雖然名字很相似,但它們的作用和用法完全不同,其核心區(qū)別如下:
- Collection是Java集合框架中的一個(gè)接口,定義了一組用于存儲(chǔ)、訪問(wèn)和操作對(duì)象的方法,它是所有集合類(lèi)的基礎(chǔ)接口之一;
- Collections是Java集合框架中的一個(gè)工具類(lèi),提供了一系列的靜態(tài)方法,方便我摸對(duì)集合進(jìn)行排序、查找、替換等操作,它是一個(gè)類(lèi),而不是一個(gè)接口。
簡(jiǎn)單來(lái)說(shuō),Collection是一個(gè)接口,是Java集合框架中的基礎(chǔ)接口之一;而Collections是一個(gè)工具類(lèi),提供了一系列靜態(tài)方法,用于對(duì)集合進(jìn)行高級(jí)操作。
四. 結(jié)語(yǔ)
至此,就把今天的內(nèi)容講解完畢了,我相信大家也已經(jīng)明白了Collection與Collections的區(qū)別了。那么今天的核心內(nèi)容,就是下面這些了:
- Collection是Java集合的基礎(chǔ)接口,List、Set等都繼承自該接口;
- Collections是操作集合的工具類(lèi),里面有若干個(gè)操作集合的方法;
- 你要熟練使用Collections里的幾個(gè)常用方法哦。
以上就是Java中Collection與Collections的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于Java Collection與Collections區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java.util.Collections類(lèi)—emptyList()方法的使用
- 淺談Java中Collections.sort對(duì)List排序的兩種方法
- Java使用Collections.sort()排序的方法
- java安全之CommonsCollections4詳解
- Java中的Collections類(lèi)的使用示例詳解
- Java中Collections.sort的使用
- Java的可變參數(shù)與Collections類(lèi)的功能示例解析
- Java Collection和Collections的區(qū)別
- Java中的集合工具類(lèi)Collections詳解
- Java中Collections.sort()排序方法舉例詳解
- Java中Collection和Collections的區(qū)別
相關(guān)文章
Java enum關(guān)鍵字不識(shí)別的快速解決辦法
這篇文章主要介紹了Java enum關(guān)鍵字不識(shí)別的快速解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09SpringBoot中@ComponentScan的使用詳解
這篇文章主要介紹了SpringBoot中@ComponentScan的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Spring Cloud Feign文件傳輸?shù)氖纠a
微服務(wù)中通常使用 Feign 作為服務(wù)消費(fèi)者,那么如何使用 Feign 接口傳輸文件呢?這篇文章主要介紹了Spring Cloud Feign文件傳輸?shù)氖纠a,感興趣的小伙伴們可以參考一下2018-06-06Spring+MyBatis多數(shù)據(jù)源配置實(shí)現(xiàn)示例
本篇文章主要介紹了Spring+MyBatis多數(shù)據(jù)源配置實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題
這篇文章主要介紹了解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized底層優(yōu)化
這篇文章主要介紹了Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized底層優(yōu)化的相關(guān)資料,主要包含了重量級(jí)鎖,輕量級(jí)鎖,偏向鎖和其他優(yōu)化等方面,有需要的小伙伴可以參考下2016-05-05Java Comparable 和 Comparator 的詳解及區(qū)別
這篇文章主要介紹了Java Comparable 和 Comparator 的詳解及區(qū)別的相關(guān)資料,Comparable 自然排序和Comparator 定制排序的實(shí)例,需要的朋友可以參考下2016-12-12myatisplus的saveOrUpdate的提交總是update問(wèn)題
這篇文章主要介紹了myatisplus的saveOrUpdate的提交總是update問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11