国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

<List<Map<String,String>>> 刪除元素常見的誤區(qū)

這篇具有很好參考價值的文章主要介紹了<List<Map<String,String>>> 刪除元素常見的誤區(qū)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

看到這么標(biāo)題可能覺得這個真是太easy了,不就remove嗎,分分鐘搞定。
但結(jié)果卻出乎意料,下面我們來j簡單說說list刪除數(shù)據(jù)可能遇到的坑:
先說明我們可能會遇到的兩個問題:
1.java.lang.IndexOutOfBoundsException(索引越界)
2.java.util.ConcurrentModificationException(并發(fā)修改異常)

開始測試:

首先初始化一個List<Map<String,String>>

package test02;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/*
 * List<Map<String,String>> 刪除元素常見的誤區(qū)
 * 
 */

public class Test09 {
	public static void main(String[] args) {
		
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		Map<String, String> map1=new HashMap<>();	
		Map<String, String> map2=new HashMap<>();
		Map<String, String> map3=new HashMap<>();
		Map<String, String> map4=new HashMap<>();
		map1.put("key","張三");
		map1.put("value","20");
		map2.put("key","李四");
		map2.put("value","25");
		map3.put("key","王五");
		map3.put("value","30");
		map4.put("key","張三");
		map4.put("value","35");
		list.add(map1);
		list.add(map2);
		list.add(map3);
		list.add(map4);	
		for (int i = 0; i < list.size(); i++) {
			System.out.println("初始化遍歷:"+list.get(i));
		}	
	}
}

需求:刪除這個list里面,key為張三的數(shù)據(jù);

方式一:for i 循環(huán) 通過索引使用:list.remove(i)刪除;

	    for (int i = 0; i < list.size(); i++) {
			System.out.println("i:"+i);
			System.out.println("len:"+list.size());
			String a = String.valueOf(list.get(i).get("key"));
			if(a.equals("張三")) {
				list.remove(i);
				System.out.println("第"+i+"次循環(huán)刪除成功");
				System.out.println("刪除后長度:"+list.size());
			}
			System.out.println("方式一遍歷:"+list.get(i));
		}

出現(xiàn)異常報錯java.lang.IndexOutOfBoundsException(索引越界)
原因:每次循環(huán)刪除元素之后,初始長度已發(fā)生變化,在最后一次循環(huán)出現(xiàn)越界
打印輸出分析:
i:0
len:4
第0次循環(huán)刪除成功
刪除后長度:3
方式一遍歷:{value=25, key=李四}
i:1
len:3
方式一遍歷:{value=30, key=王五}
i:2
len:3
第2次循環(huán)刪除成功
刪除后長度:2
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at test01/test02.Test09.main(Test09.java:62)

方式二:foreach循環(huán):list.remove(map)刪除

	   for(Map<String, String> map :list) {
			String a = String.valueOf(map.get("key"));
			if(a.equals("張三")) {
				list.remove(map);
			}
			System.out.println("方式二遍歷:"+map);
		}

出現(xiàn)異常報錯java.util.ConcurrentModificationException(并發(fā)修改異常)
通過源碼分析:發(fā)現(xiàn)在 next、remove方法中都會調(diào)用checkForComodification 方法,
該方法的 作用是判斷 modCount != expectedModCount是否相等,
如果不相等則拋出ConcurrentModificationException異常;
當(dāng)我們調(diào)用 list.remove(item)時,對 list 對象的 modCount 值進(jìn)行了修改;
而 list 對象的迭代器的 expectedModCount 值未進(jìn)行修改;
所以就拋出ConcurrentModificationException異常!
private class Itr implements Iterator {
int cursor; // 要返回的下一個元素的索引
int lastRet = -1; // 返回的最后一個元素的索引;如果沒有就返回-1
int expectedModCount = modCount;

    public boolean hasNext() {
        return cursor != size;
    }

    @SuppressWarnings("unchecked")
    public E next() {
        checkForComodification();
        int i = cursor;
        if (i >= size)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList.this.elementData;
        if (i >= elementData.length)
            throw new ConcurrentModificationException();
        cursor = i + 1;
        return (E) elementData[lastRet = i];
    }

    public void remove() {
        if (lastRet < 0)
            throw new IllegalStateException();
        checkForComodification();

        try {
            ArrayList.this.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}

方式三:Stream流:filter(推薦)

		list = list.stream().filter(e -> (!e.get("key").equals("張三"))).collect(Collectors.toList());
		for (int i = 0; i < list.size(); i++) {
			System.out.println("方式三遍歷:"+list.get(i));
		}

輸出:
方式三遍歷:{value=25, key=李四}
方式三遍歷:{value=30, key=王五}

方式四:迭代器iterator的remove方法(使用更加靈活

		Iterator<Map<String, String>> iterator = list.iterator();
		while (iterator.hasNext()){
            Map<String, String> next = iterator.next();
            String key = String.valueOf(next.get(("key")));
            if(key.equals("張三")){
                iterator.remove();
            }
        }
        for (Map<String, String> map : list) {
			System.out.println("方式四遍歷:"+map);
		}

輸出:
方式四遍歷:{value=25, key=李四}
方式四遍歷:{value=30, key=王五}

簡單總結(jié):

1、用for循環(huán)遍歷List刪除元素時,需要注意索引變化(左移或右移)的問題(不推薦)。
2、List刪除元素時,默認(rèn)按索引刪除,而不是對象刪除(不推薦)。
3、List刪除元素時,為避免陷阱,建議使用Stream流的filter方式(推薦)。
3、List刪除元素時,為避免陷阱,建議使用迭代器iterator的remove方式(推薦)。文章來源地址http://www.zghlxwxcb.cn/news/detail-522050.html

到了這里,關(guān)于<List<Map<String,String>>> 刪除元素常見的誤區(qū)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java 中 List 刪除元素

    刪除某個元素后,list的大小發(fā)生了變化,會導(dǎo)致遍歷準(zhǔn)確。 這種方式可以用在刪除特定的一個元素時使用,但不適合循環(huán)刪除多個元素時使用 刪除元素后繼續(xù)循環(huán)會報錯誤信息 ConcurrentModificationException ,但是刪除完畢馬上使用break跳出,則不會觸發(fā)報錯。 iterator遍歷過程中

    2024年02月09日
    瀏覽(20)
  • Java list安全刪除元素詳解

    Java list安全刪除元素詳解

    前一段時間被問到了關(guān)于 List 集合的安全刪除元素問題。一時間沒反應(yīng)過來這問題問的是什么,安全體現(xiàn)在什么地方,線程安全?線程安全可以保證元素粒度的數(shù)據(jù)唯一嗎?刪除是指什么,list.remove()? 帶著這些疑問,重溫了一下Java的集合知識。 List為什么需要安全移除? 我

    2024年02月09日
    瀏覽(40)
  • Java List循環(huán)安全刪除元素

    Java List循環(huán)安全刪除元素的幾種方式如下: 使用迭代器(Iterator):通過調(diào)用List的iterator()方法獲取List的迭代器,然后使用迭代器的remove()方法刪除元素。這種方式可以避免在遍歷過程中修改List導(dǎo)致的并發(fā)修改異常(ConcurrentModificationException)。 示例代碼: 使用Java 8的Stream

    2024年02月11日
    瀏覽(22)
  • Java8使用stream流給List<Map<String,Object>>分組(多字段key)

    Java8使用 stream流 給ListMapString,Object根據(jù)字段key 分組 一、項目場景: 從已得到的List集合中,根據(jù)某一元素(這里指map的key)進(jìn)行分組,篩選出需要的數(shù)據(jù)。 如果是SQL的話則使用 group by 直接實現(xiàn),代碼的方式則如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代碼實現(xiàn) 1、首

    2024年02月02日
    瀏覽(87)
  • java 兩個list比較,刪除相同的元素

    java 兩個list比較,刪除相同的元素

    概述 在Java開發(fā)中,經(jīng)常需要比較兩個List并刪除相同的元素。本文將介紹整個流程,并提供相應(yīng)的代碼示例,幫助新手開發(fā)者完成這個任務(wù)。 流程 下面是比較兩個List并刪除相同元素的流程: 代碼示例 創(chuàng)建兩個List 我們首先需要創(chuàng)建兩個List對象,分別代表待比較的兩個列表

    2024年02月07日
    瀏覽(28)
  • Java從List中刪除元素的正確用法

    Java從List中刪除元素的正確用法

    還是先舉個例子,你侄女對天文知識感興趣,然后你就用程序?qū)懥颂栂稻糯笮窍担ㄋ?、金星、地球、火星、木星、土星、天王星、海王星、冥王星)的運行軌跡圖,然后拿給侄女看。然后她說錯了錯了,你的知識太舊了,多了一顆星。根據(jù)2006年8月24日國際天文聯(lián)合大會召

    2024年02月09日
    瀏覽(27)
  • Java 定義返回一個不能被修改、刪除元素的List

    Java 定義返回一個不能被修改、刪除元素的List

    ? 為啥突然分享下這個,也是從mybatis源碼看到了,所以想分享下: org.apache.ibatis.plugin.InterceptorChain ? 使用?Collections.unmodifiableList(); 示例: 運行效果: 不給動。 ?

    2024年02月13日
    瀏覽(45)
  • Java-json相關(guān)轉(zhuǎn)換,JSONObject與實體類/map互轉(zhuǎn)、List/List<map>和JSONArray互轉(zhuǎn)、獲取JSONObject中的key value、字符串String轉(zhuǎn)換等

    博客背景是Java開發(fā)。json相關(guān)的轉(zhuǎn)換、取值等在日常開發(fā)中經(jīng)常使用,但有時候還是會忘記or遇到些奇奇怪怪的問題。以此記錄,提醒自己~不定期更新~ 實體類和JSONObject互轉(zhuǎn) Map和JSONObject互轉(zhuǎn) String轉(zhuǎn)JSONObject 實體類轉(zhuǎn)JSON字符串時不過濾NULL空值 獲取JSONObject中的key value List和

    2024年02月12日
    瀏覽(29)
  • 使用java8 新特性stream流對List<Map<String, Object>>集合進(jìn)行遍歷、過濾、查詢、去重、排序、分組

    對于一個ListMapString, Object類型的數(shù)據(jù),可以使用Java 8的新特性stream流來進(jìn)行遍歷、過濾、查詢、去重、排序、分組等操作。 遍歷: 過濾: 查詢: 去重: 排序: 分組:

    2024年02月10日
    瀏覽(106)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包