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

java集合中的迭代器Iterator和數(shù)組內置方法及常見的報錯解決方案

 更新時間:2025年02月04日 09:33:26   作者:何人陪我共長生  
文章介紹了Java集合框架中迭代器(Iterator)的使用,以及數(shù)組和集合的內置方法,重點解釋了在遍歷集合時刪除元素時可能出現(xiàn)的`ConcurrentModificationException`異常,并說明了如何正確地使用迭代器來刪除集合中的元素,感興趣的朋友跟隨小編一起看看吧

刪除Map的中某一項報錯

package part;
import java.util.HashMap;
import java.util.Set;
public class Java01 {
    public static void main(String[] args) {
        // 為啥這里要使用包裝類型 Integer, 而不是int
        HashMap<String, Integer> map = new HashMap();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        // 獲取所有鍵名的集合,返回類型是 Set 類型
        Set<String> Keys = map.keySet();
        // 增強型for循環(huán)
        for (String keyName : Keys) {
            // 鍵名相等的話,刪除掉, 導致程序報錯了呀。 會報錯
            if(keyName == "b"){
              //   map.remove(keyName); 刪除會報錯的
                map.put("n",11); // 新增也是會報錯的
                map.put(keyName, 200); // ok的,但是我們最好還是使用迭代器來操作
            }
        }
    }
}

為啥這里要使用包裝類型 Integer, 而不是int

因為: HashMap的鍵和值必須是對象類型,不能是基本數(shù)據(jù)類型。
Java 提供了自動裝箱(int 轉 Integer)和拆箱(Integer 轉 int)的功能
int 類型自動裝箱后就是 Integer

為哈會報錯呢?

我們在循環(huán)中途的某一項的時候,不光是刪除,新增也會報錯的
因為:當你使用 for-each 循環(huán)遍歷 HashMap 的鍵集合時
for-each 底層是通過 Iterator 實現(xiàn)的
Iterator 會檢查集合是否被修改(通過一個 modCount 變量)來判斷
如果發(fā)現(xiàn)集合被修改(例添加、刪除元素),就會拋出 ConcurrentModificationException

為啥在遍歷最后一項的時候刪除就不會報錯呢

package part;
import java.util.HashMap;
import java.util.Set;
public class Java01 {
    public static void main(String[] args) {
        //  HashMap的鍵和值必須是對象類型,不能是基本數(shù)據(jù)類型。 int 類型自動裝箱后就是 Integer  
        HashMap<String, Integer> map = new HashMap();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        // 獲取所有鍵名的集合,返回類型是 Set 類型
        Set<String> Keys = map.keySet();
        // 增強型for循環(huán)
        for (String keyName : Keys) {
            // 當遍歷最后一項的時候,刪除就不會報錯
            if(keyName == "c"){
                map.remove(keyName);
            }
        }
    }
}

解釋:為什么刪除最后一項不會報錯?

這個跟(ConcurrentModificationException)觸發(fā)機制
(ConcurrentModificationException) 是通過 modCount 變量來檢測集合是否被修改的。
在遍歷集合時,Iterator 會檢查 modCount 是否與預期值一致。如果不一致(即集合被修改),就會拋出異常。
當你刪除最后一項時,Iterator 可能已經完成了遍歷,因此不會觸發(fā) modCount 的檢查。
因此也就不會報錯哈

修改數(shù)據(jù)最好使用迭代器來處理

package part;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Java01 {
    public static void main(String[] args) {
        // 為啥這里要使用包裝類型 Integer, 而不是int
        HashMap<String, Integer> map = new HashMap();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        Set<String> keys = map.keySet();
        // 迭代器
        Iterator<String> it =keys.iterator();
        // hasNext方法用于辦法是否存在下一條數(shù)據(jù)
        while (it.hasNext()) {
            // 獲取下一條數(shù)據(jù)
            String key = it.next();
            // 刪除鍵名是b這一項
            if("b".equals(key)){
                it.remove();
            }
            // 1 null 3
            System.out.println(map.get(key));
        }
        // {a=1, c=3}
        System.out.println(map);
    }
}

使用 removeIf() 方法(Java 8+)迭代

HashMap<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Set<String> keys = map.keySet();
keys.removeIf(keyName -> keyName.equals("c")); // 使用 removeIf
System.out.println(map); // 輸出: {a=1, b=2}

使用迭代器能夠刪除其他項嗎?

就是說:我們在循環(huán)a這一項的時候,可以刪除b這一項的數(shù)據(jù)嗎?
不可以的。
因為:只能夠刪除當前循環(huán)的這一項的。再說一次:只能夠刪除當前循環(huán)的這一項的

將數(shù)組轉化為字符串 Arrays.toString()

package part;
import java.util.Arrays;
public class Java01 {
    public static void main(String[] args) {
        // 聲明并初始化一個 int 數(shù)組
        int[] is= {1, 2, 3, 4, 5};
        // 轉化為字符串 [1, 2, 3, 4, 5]
        String str = Arrays.toString(is);
        System.out.println(str);
        // [I@28d93b30 是hashCode的內存地址
        System.out.println(is);
    }
}

將數(shù)組轉化為集合以及升序

package part;
import java.util.Arrays;
import java.util.List;
public class Java01 {
    public static void main(String[] args) {
        // 將數(shù)組轉化為集合
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        int[] arr =  {4,1,-3,10 };
        // Arrays.sort 默認是升序的哈,會影響原始數(shù)組的哈,與js不同的
        Arrays.sort(arr);
        // [-3, 1, 4, 10]
        System.out.println(Arrays.toString(arr));
    }
}

二分查找法,查找的是排序后的位置

package part;
import java.util.Arrays;
import java.util.List;
public class Java01 {
    public static void main(String[] args) {
        int[] arr =  {4,1,-3,10 };
        Arrays.sort(arr);
        // [-3, 1, 4, 10]
        System.out.println(Arrays.toString(arr));
        // 查詢4的位置
        int index = Arrays.binarySearch(arr, 4);
        // 2
        System.out.println(index);
    }
}

2個數(shù)組項比較

package part;
import java.util.Arrays;
import java.util.List;
public class Java01 {
    public static void main(String[] args) {
        int[] arr1 =  {4,1,-3,10 };
        int[] arr2 = {4,1,10, -3};
        // 會比較2個數(shù)組是否相等,會一對一進行比較。 第2項的-3和第2項的10不相等,返回flase
        System.out.println(Arrays.equals(arr1,arr2)); // false
    }
}
package part;
import java.util.Arrays;
import java.util.List;
public class Java01 {
    public static void main(String[] args) {
        int[] arr1 = {4, 1, -3, 10};
        int[] arr2 = {4, 1, 10, -3};
        //arr1, 0, 2表示從arr1數(shù)組中,從0開始取,取前2個。 arr2, 0, 2表示從arr2數(shù)組中,從0開始取,取前2個
        // 特別需要注意一點的是: 是在 JDK 9 中引入的。如果你使用的是 JDK 8 或更早版本,這個方法會報錯。
        System.out.println(Arrays.equals(arr1, 0, 2, arr2, 0, 2)); // 輸出: true
    }
}

ArrayList 集合默認時長度10,你設置容器大小必須大于等于0。如果是負數(shù)會報錯

package part;
import java.util.ArrayList;
public class Java01 {
    public static void main(String[] args) {
        ArrayList<String > list2 = new ArrayList<String>(0);
        System.out.println(list2); // []
       ArrayList<String> list1 = new ArrayList<String>(-1);
       System.out.println(list1); //  ava.lang.IllegalArgumentException 非法參數(shù)異常
    }
}

ArrayList的訪問范圍是[0,長度-1]

package part;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Java01 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("A");
        list.add("B");
        list.add("C");
        // 訪問的范圍是[0,長度-1]
        System.out.println(list.get(2));
        // IndexOutOfBoundsException 索引超出異常
        System.out.println(list.get(3));
    }
}

LinkedList的長度是0,使用get(0)和getFirst訪問報錯

package part;
import java.util.LinkedList;
public class Java01 {
    public static void main(String[] args) {
       LinkedList<String> list = new LinkedList<String>();
       //報錯 IndexOutOfBoundsException
       System.out.println(list.get(0));
       // list的長度是0, 現(xiàn)在你獲取第1項,這樣的操作跟索引越界相似。同樣也是會報錯的
        // java.util.NoSuchElementException
       System.out.println(list.getFirst());
    }
}

JAVA 復制 全屏

HashMap在循環(huán)的時候刪除,新增數(shù)據(jù)會報錯

package part;
import java.util.HashMap;
import java.util.LinkedList;
public class Java01 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("a",1);
        map.put("b",2);
        map.put("c",3);
        // HashMap一旦開始循環(huán),那么如果刪除,新增數(shù)據(jù),就會發(fā)生錯誤
        for (Object key : map.keySet()) {
            if(key.equals("b")){
               // map.remove(key); 刪除數(shù)據(jù)報錯
               //  map.put("d",4); 新增數(shù)據(jù)報錯
                map.put(key,4); // 修改數(shù)據(jù)不會報錯的哈
            }
        }
        // 我們可以使用迭代器還解決這樣的問題哈。
        System.out.println(map);
    }
}

到此這篇關于java集合中的迭代器Iterator和數(shù)組內置方法以及常見的報錯的文章就介紹到這了,更多相關java迭代器Iterator和數(shù)組內置方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis insert操作插入數(shù)據(jù)之后返回插入記錄的id

    MyBatis insert操作插入數(shù)據(jù)之后返回插入記錄的id

    今天小編就為大家分享一篇關于MyBatis插入數(shù)據(jù)之后返回插入記錄的id,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java之類加載機制案例講解

    Java之類加載機制案例講解

    這篇文章主要介紹了Java之類加載機制案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解

    Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解

    這篇文章主要介紹了Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解,HashMap的key保留了對實際對象的強引用,這意味著只要HashMap對象不被銷毀,還HashMap的所有key所引用的對象就不會被垃圾回收,需要的朋友可以參考下
    2023-09-09
  • Java實現(xiàn)BCrypt密碼加密的示例

    Java實現(xiàn)BCrypt密碼加密的示例

    本文介紹了MySQL數(shù)據(jù)庫密碼安全存儲的方法,使用BCrypt不可逆加密,自動加鹽,每次加密結果不同,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • spring-data-elasticsearch @Field注解無效的完美解決方案

    spring-data-elasticsearch @Field注解無效的完美解決方案

    這篇文章主要介紹了spring-data-elasticsearch @Field注解無效的完美解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    這篇文章將帶大家從ArrayList源碼來探秘一下Java動態(tài)數(shù)組的實現(xiàn),文中的示例代碼講解詳細,對我們深入了解JavaScript有一定的幫助,需要的可以參考一下
    2023-08-08
  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數(shù)據(jù)類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關于Java中Boolean和boolean區(qū)別的相關資料,需要的朋友可以參考下
    2022-07-07
  • Spring?AOT優(yōu)化轉換的使用原理詳解

    Spring?AOT優(yōu)化轉換的使用原理詳解

    這篇文章主要介紹了Spring?AOT優(yōu)化轉換的使用原理,Spring?AOT是一種在構建時對Spring應用進行優(yōu)化的技術,主要為GraalVM原生鏡像生成配置,同時提升傳統(tǒng)JVM的啟動性能,需要的朋友可以參考下
    2025-10-10
  • Struts2的配置文件方法小結

    Struts2的配置文件方法小結

    最近正在學習Struts2,在配置文件中遇到好多標簽,各種意義不同。下面這篇文章就來給大家介紹關于Struts2配置文件的相關資料,文中通過圖文介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • JavaScript中的Map用法完全指南

    JavaScript中的Map用法完全指南

    這篇文章主要介紹了JavaScript中Map用法的相關資料,通過實例講解了Map的創(chuàng)建、常用方法和迭代方式,還探討了Map與對象的區(qū)別,并通過一個例子展示了如何使用Map來統(tǒng)計字符出現(xiàn)的次數(shù),需要的朋友可以參考下
    2025-03-03

最新評論

洛川县| 增城市| 玛曲县| 民丰县| 盐津县| 镇远县| 安顺市| 彭山县| 旺苍县| 乐昌市| 漯河市| 甘孜县| 华蓥市| 鲜城| 奎屯市| 宝清县| 上饶市| 安庆市| 平南县| 自贡市| 仙居县| 精河县| 建宁县| 永春县| 略阳县| 洪洞县| 神农架林区| 兴安县| 上高县| 遵义市| 根河市| 孝昌县| 聊城市| 乌拉特前旗| 遂昌县| 岳池县| 正蓝旗| 凤阳县| 柘城县| 太仓市| 常德市|