六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)
1.集合判空
判斷所有集合內(nèi)部的元素是否為空,使用 isEmpty() 方法,而不是 size()==0 的方式
這是因?yàn)?isEmpty() 方法的可讀性更好,并且時(shí)間復(fù)雜度為 O(1)。
絕大部分我們使用的集合的 size() 方法的時(shí)間復(fù)雜度也是 O(1),不過(guò),也有很多復(fù)雜度不是 O(1) 的,比如 java.util.concurrent 包下的某些集合(ConcurrentLinkedQueue 、ConcurrentHashMap…)。
2.集合轉(zhuǎn) Map
在使用 java.util.stream.Collectors 類(lèi)的 toMap() 方法轉(zhuǎn)為 Map 集合時(shí),一定要注意當(dāng) value 為 null 時(shí)會(huì)拋 NPE 異常。
3.集合遍歷
不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作。remove 元素請(qǐng)使用 Iterator 方式,如果并發(fā)操作,需要對(duì) Iterator 對(duì)象加鎖。
通過(guò)反編譯你會(huì)發(fā)現(xiàn) foreach 語(yǔ)法底層其實(shí)還是依賴(lài) Iterator 。不過(guò), remove/add 操作直接調(diào)用的是集合自己的方法,而不是 Iterator 的 remove/add方法
這就導(dǎo)致 Iterator 莫名其妙地發(fā)現(xiàn)自己有元素被 remove/add ,然后,它就會(huì)拋出一個(gè) ConcurrentModificationException 來(lái)提示用戶(hù)發(fā)生了并發(fā)修改異常。這就是單線程狀態(tài)下產(chǎn)生的 fail-fast 機(jī)制。
fail-fast 機(jī)制 :多個(gè)線程對(duì) fail-fast 集合進(jìn)行修改的時(shí)候,可能會(huì)拋出ConcurrentModificationException。 即使是單線程下也有可能會(huì)出現(xiàn)這種情況
4.集合去重
可以利用 Set 元素唯一的特性,可以快速對(duì)一個(gè)集合進(jìn)行去重操作,避免使用 List 的 contains() 進(jìn)行遍歷去重或者判斷包含操作。
5.集合轉(zhuǎn)數(shù)組
使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的 toArray(T[] array),傳入的是類(lèi)型完全一致、長(zhǎng)度為 0 的空數(shù)組。
toArray(T[] array) 方法的參數(shù)是一個(gè)泛型數(shù)組,如果 toArray 方法中沒(méi)有傳遞任何參數(shù)的話返回的是 Object類(lèi) 型數(shù)組。
使用實(shí)例:
String [] s= new String[]{ "dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A" }; List<String> list = Arrays.asList(s); Collections.reverse(list); //沒(méi)有指定類(lèi)型的話會(huì)報(bào)錯(cuò) s=list.toArray(new String[0]);
6.數(shù)組轉(zhuǎn)集合
使用工具類(lèi) Arrays.asList() 把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法, 它的 add/remove/clear 方法會(huì)拋出 UnsupportedOperationException 異常。
asList使用實(shí)例:
String[] myArray = {"Apple", "Banana", "Orange"}; List<String> myList = Arrays.asList(myArray); //上面兩個(gè)語(yǔ)句等價(jià)于下面一條語(yǔ)句 List<String> myList = Arrays.asList("Apple","Banana", "Orange");
下面我們來(lái)總結(jié)一下使用注意事項(xiàng)。
1、Arrays.asList()是泛型方法,傳遞的數(shù)組必須是對(duì)象數(shù)組,而不是基本類(lèi)型。
int[] myArray = {1, 2, 3}; List myList = Arrays.asList(myArray); System.out.println(myList.size());// 1 System.out.println(myList.get(0));// 數(shù)組地址值 System.out.println(myList.get(1));// 報(bào)錯(cuò):ArrayIndexOutOfBoundsException int[] array = (int[]) myList.get(0); System.out.println(array[0]);// 1
當(dāng)傳入一個(gè)原生數(shù)據(jù)類(lèi)型數(shù)組時(shí),Arrays.asList() 的真正得到的參數(shù)就不是數(shù)組中的元素,而是數(shù)組對(duì)象本身!此時(shí) List 的唯一元素就是這個(gè)數(shù)組,這也就解釋了上面的代碼。
我們使用包裝類(lèi)型數(shù)組就可以解決這個(gè)問(wèn)題。
Integer[] myArray = {1, 2, 3};
2、使用集合的修改方法: add()、remove()、clear()會(huì)拋出異常。
List myList = Arrays.asList(1, 2, 3); myList.add(4);// 運(yùn)行時(shí)報(bào)錯(cuò):UnsupportedOperationException myList.remove(1);// 運(yùn)行時(shí)報(bào)錯(cuò):UnsupportedOperationException myList.clear();// 運(yùn)行時(shí)報(bào)錯(cuò):UnsupportedOperationException
Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一個(gè)內(nèi)部類(lèi),這個(gè)內(nèi)部類(lèi)并沒(méi)有實(shí)現(xiàn)集合的修改方法或者說(shuō)并沒(méi)有重寫(xiě)這些方法。
那我們?nèi)绾握_的將數(shù)組轉(zhuǎn)換為 ArrayList ?
1、手動(dòng)實(shí)現(xiàn)工具類(lèi)
//JDK1.5+ static <T> List<T> arrayToList(final T[] array) { final List<T> l = new ArrayList<T>(array.length); for (final T s : array) { l.add(s); } return l; } Integer [] myArray = { 1, 2, 3 }; System.out.println(arrayToList(myArray).getClass()); // class java.util.ArrayList
2、最簡(jiǎn)便的方法
List list = new ArrayList<>(Arrays.asList("a", "b", "c"))
3、使用 Java8 的 Stream(推薦)
Integer [] myArray = { 1, 2, 3 }; List myList = Arrays.stream(myArray).collect(Collectors.toList()); // 基本類(lèi)型也可以實(shí)現(xiàn)轉(zhuǎn)換(依賴(lài)boxed的裝箱操作) int [] myArray2 = { 1, 2, 3 }; List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());
4、 使用 Java9 的 List.of()方法
Integer[] array = {1, 2, 3}; List<Integer> list = List.of(array);
到此這篇關(guān)于六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)的文章就介紹到這了,更多相關(guān)Java集合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse配置tomcat發(fā)布路徑的問(wèn)題wtpwebapps解決辦法
這篇文章主要介紹了Eclipse配置tomcat發(fā)布路徑的問(wèn)題wtpwebapps解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06Java中String.split()的最詳細(xì)源碼解讀及注意事項(xiàng)
以前經(jīng)常使用String.split()方法,但是從來(lái)沒(méi)有注意,下面這篇文章主要給大家介紹了關(guān)于Java中String.split()最詳細(xì)源碼解讀及注意事項(xiàng)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07ssm框架Springmvc文件上傳實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了ssm框架Springmvc文件上傳實(shí)現(xiàn)代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07怎樣將一個(gè)JAR包添加到Java應(yīng)用程序的Boot?Classpath中
本文文章給大家介紹如何將一個(gè)JAR包添加到Java應(yīng)用程序的Boot?Classpath中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下吧2023-11-11JAVA Iterator 轉(zhuǎn)成 List 的操作
這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Java 實(shí)現(xiàn)加密數(shù)據(jù)庫(kù)連接的步驟
這篇文章主要介紹了Java 實(shí)現(xiàn)加密數(shù)據(jù)庫(kù)連接的步驟,幫助大家更好的理解和使用Java處理數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11SpringBoot將Spring fox更換為Springdoc的方法詳解
由于項(xiàng)目中使用Spring fox已經(jīng)不維護(hù)更新了,代碼掃描,掃出問(wèn)題,需要將Spring fox更換為Spring Doc,所以本文給大家介紹了SpringBoot將Spring fox更換為Springdoc的方法,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-01-01Java 數(shù)據(jù)類(lèi)型及類(lèi)型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了Java 數(shù)據(jù)類(lèi)型及類(lèi)型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼,需要的朋友可以參考下2020-10-10