最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)

 更新時(shí)間:2023年01月29日 09:27:05   作者:世界盡頭與你  
這篇文章主要為大家詳細(xì)介紹了六個(gè)Java集合使用時(shí)需要注意的事項(xiàng),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java有一定的幫助,需要的可以參考一下

1.集合判空

判斷所有集合內(nèi)部的元素是否為空,使用 isEmpty() 方法,而不是 size()==0 的方式

這是因?yàn)?isEmpty() 方法的可讀性更好,并且時(shí)間復(fù)雜度為 O(1)。

絕大部分我們使用的集合的 size() 方法的時(shí)間復(fù)雜度也是 O(1),不過,也有很多復(fù)雜度不是 O(1) 的,比如 java.util.concurrent 包下的某些集合(ConcurrentLinkedQueue 、ConcurrentHashMap…)。

2.集合轉(zhuǎn) Map

在使用 java.util.stream.Collectors 類的 toMap() 方法轉(zhuǎn)為 Map 集合時(shí),一定要注意當(dāng) value 為 null 時(shí)會拋 NPE 異常。

3.集合遍歷

不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作。remove 元素請使用 Iterator 方式,如果并發(fā)操作,需要對 Iterator 對象加鎖。

通過反編譯你會發(fā)現(xiàn) foreach 語法底層其實(shí)還是依賴 Iterator 。不過, remove/add 操作直接調(diào)用的是集合自己的方法,而不是 Iterator 的 remove/add方法

這就導(dǎo)致 Iterator 莫名其妙地發(fā)現(xiàn)自己有元素被 remove/add ,然后,它就會拋出一個(gè) ConcurrentModificationException 來提示用戶發(fā)生了并發(fā)修改異常。這就是單線程狀態(tài)下產(chǎn)生的 fail-fast 機(jī)制。

fail-fast 機(jī)制 :多個(gè)線程對 fail-fast 集合進(jìn)行修改的時(shí)候,可能會拋出ConcurrentModificationException。 即使是單線程下也有可能會出現(xiàn)這種情況

4.集合去重

可以利用 Set 元素唯一的特性,可以快速對一個(gè)集合進(jìn)行去重操作,避免使用 List 的 contains() 進(jìn)行遍歷去重或者判斷包含操作。

5.集合轉(zhuǎn)數(shù)組

使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全一致、長度為 0 的空數(shù)組。

toArray(T[] array) 方法的參數(shù)是一個(gè)泛型數(shù)組,如果 toArray 方法中沒有傳遞任何參數(shù)的話返回的是 Object類 型數(shù)組。

使用實(shí)例:

String [] s= new String[]{
    "dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"
};
List<String> list = Arrays.asList(s);
Collections.reverse(list);
//沒有指定類型的話會報(bào)錯(cuò)
s=list.toArray(new String[0]);

6.數(shù)組轉(zhuǎn)集合

使用工具類 Arrays.asList() 把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法, 它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

asList使用實(shí)例:

String[] myArray = {"Apple", "Banana", "Orange"};
List<String> myList = Arrays.asList(myArray);
//上面兩個(gè)語句等價(jià)于下面一條語句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");

下面我們來總結(jié)一下使用注意事項(xiàng)。

1、Arrays.asList()是泛型方法,傳遞的數(shù)組必須是對象數(shù)組,而不是基本類型。

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ù)類型數(shù)組時(shí),Arrays.asList() 的真正得到的參數(shù)就不是數(shù)組中的元素,而是數(shù)組對象本身!此時(shí) List 的唯一元素就是這個(gè)數(shù)組,這也就解釋了上面的代碼。

我們使用包裝類型數(shù)組就可以解決這個(gè)問題。

Integer[] myArray = {1, 2, 3};

2、使用集合的修改方法: add()、remove()、clear()會拋出異常。

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)部類,這個(gè)內(nèi)部類并沒有實(shí)現(xiàn)集合的修改方法或者說并沒有重寫這些方法。

那我們?nèi)绾握_的將數(shù)組轉(zhuǎn)換為 ArrayList ?

1、手動(dòng)實(shí)現(xiàn)工具類

//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、最簡便的方法

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());
// 基本類型也可以實(shí)現(xiàn)轉(zhuǎn)換(依賴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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA?報(bào)Plugin'maven-resources-plugin:'not?found?的解決方案

    IDEA?報(bào)Plugin'maven-resources-plugin:'not?found?

    如果在使用?IDEA?時(shí)遇到?"Plugin?'maven-resources-plugin:'?not?found"?錯(cuò)誤,可能是由于?Maven?倉庫中未找到所需的?Maven?插件,近小編給大家分享幾種解決方法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • java ImmutableMap的使用說明

    java ImmutableMap的使用說明

    這篇文章主要介紹了java ImmutableMap的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java?AQS?原理與?ReentrantLock?實(shí)現(xiàn)方法

    Java?AQS?原理與?ReentrantLock?實(shí)現(xiàn)方法

    AQS 的作用是解決同步器的實(shí)現(xiàn)問題,它將復(fù)雜的同步器實(shí)現(xiàn)分解為簡單的框架方法,開發(fā)者只需要實(shí)現(xiàn)少量特定的方法就能快速構(gòu)建出可靠的同步器,這篇文章主要介紹Java AQS原理與ReentrantLock實(shí)現(xiàn),需要的朋友可以參考下
    2025-03-03
  • 解讀Spring?Bean的作用域

    解讀Spring?Bean的作用域

    這篇文章主要介紹了解讀Spring?Bean的作用域,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解java中String值為空字符串與null的判斷方法

    詳解java中String值為空字符串與null的判斷方法

    這篇文章主要介紹了詳解java中String值為空字符串與null的判斷方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 從零搭建SpringBoot+MyBatisPlus快速開發(fā)腳手架

    從零搭建SpringBoot+MyBatisPlus快速開發(fā)腳手架

    這篇文章主要為大家介紹了從零搭建SpringBoot+MyBatisPlus快速開發(fā)腳手架示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Spring集成MongoDB的兩種方法實(shí)例

    Spring集成MongoDB的兩種方法實(shí)例

    最近使用到了Spring框架,考慮到數(shù)據(jù)的格式并非有固定的字段格式,因此考慮到使用MongoDB非關(guān)系型數(shù)據(jù)庫存儲數(shù)據(jù),所以這篇文章主要給大家介紹了Spring集成MongoDB的兩種方法,需要的朋友可以參考下
    2021-09-09
  • 詳解java中各類鎖的機(jī)制

    詳解java中各類鎖的機(jī)制

    這篇文章為大家總結(jié)了java中常見的鎖(互斥鎖、讀寫鎖、公平鎖與非公平鎖等)的機(jī)制以及如何使用,文中示例代碼講解詳細(xì),需要的可以學(xué)習(xí)一下
    2021-12-12
  • SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會話項(xiàng)目實(shí)戰(zhàn)

    SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會話項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會話項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java Scala之模式匹配與隱式轉(zhuǎn)換

    Java Scala之模式匹配與隱式轉(zhuǎn)換

    在Java中我們有switch case default這三個(gè)組成的基礎(chǔ)語法,在Scala中我們是有match和case組成 default的作用由case代替,本文詳細(xì)介紹了Scala的模式匹配與隱式轉(zhuǎn)換,感興趣的可以參考本文
    2023-04-04

最新評論

皮山县| 泽州县| 泽普县| 平谷区| 修武县| 桑植县| 泗洪县| 色达县| 拉萨市| 措美县| 西城区| 六枝特区| 临澧县| 荥经县| 巧家县| 锡林浩特市| 大城县| 秀山| 贵南县| 扶风县| 承德县| 石门县| 张掖市| 松滋市| 密云县| 大洼县| 西乡县| 青铜峡市| 牙克石市| 庄浪县| 舟曲县| 龙胜| 博湖县| 呼图壁县| 镇沅| 高清| 昌图县| 澳门| 河北省| 松溪县| 贵定县|