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

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

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

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

開始測(cè)試:

首先初始化一個(gè)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));
		}	
	}
}

需求:刪除這個(gè)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("刪除后長(zhǎng)度:"+list.size());
			}
			System.out.println("方式一遍歷:"+list.get(i));
		}

出現(xiàn)異常報(bào)錯(cuò)java.lang.IndexOutOfBoundsException(索引越界)
原因:每次循環(huán)刪除元素之后,初始長(zhǎng)度已發(fā)生變化,在最后一次循環(huán)出現(xiàn)越界
打印輸出分析:
i:0
len:4
第0次循環(huán)刪除成功
刪除后長(zhǎng)度:3
方式一遍歷:{value=25, key=李四}
i:1
len:3
方式一遍歷:{value=30, key=王五}
i:2
len:3
第2次循環(huán)刪除成功
刪除后長(zhǎng)度: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)異常報(bào)錯(cuò)java.util.ConcurrentModificationException(并發(fā)修改異常)
通過源碼分析:發(fā)現(xiàn)在 next、remove方法中都會(huì)調(diào)用checkForComodification 方法,
該方法的 作用是判斷 modCount != expectedModCount是否相等,
如果不相等則拋出ConcurrentModificationException異常;
當(dāng)我們調(diào)用 list.remove(item)時(shí),對(duì) list 對(duì)象的 modCount 值進(jìn)行了修改;
而 list 對(duì)象的迭代器的 expectedModCount 值未進(jìn)行修改;
所以就拋出ConcurrentModificationException異常!
private class Itr implements Iterator {
int cursor; // 要返回的下一個(gè)元素的索引
int lastRet = -1; // 返回的最后一個(gè)元素的索引;如果沒有就返回-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ǎn)單總結(jié):

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

到了這里,關(guān)于<List<Map<String,String>>> 刪除元素常見的誤區(qū)以及刪除方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Python list列表刪除元素(4種方法)

    Python list列表刪除元素(4種方法)

    在?Python列表中刪除元素主要分為以下 3 種場(chǎng)景: 根據(jù)目標(biāo)元素所在位置的索引進(jìn)行刪除,可以使用 del 或者 pop() 方法; 根據(jù)元素本身的值進(jìn)行刪除,可使用列表(list類型)提供的 remove() 方法; 將列表中所有元素全部刪除,可使用列表(list類型)提供的 clear() 方法

    2024年02月02日
    瀏覽(117)
  • <List<Map<String,Object>>>Map中多個(gè)屬性轉(zhuǎn)成List Map

    舉例: 原始數(shù)據(jù) :{001=張三, 002=李四, 003=王五, 004=趙六} 目標(biāo)數(shù)據(jù) : {value=張三, key=001} {value=李四, key=002} {value=王五, key=003} {value=趙六, key=004} 輸出: 單獨(dú)封裝工具類案例:

    2024年02月11日
    瀏覽(43)
  • JSON轉(zhuǎn)換List<Map<String, Object>>、Map<String, Object>

    廢話就不說了 早上10點(diǎn)研究到現(xiàn)在 獲取redis的JSON字符串 String getPalletListNew = redisService.getRedis(“getPalletListNew”, abroad + “” + goodsLevel + “” + startPort + “” + destinationPort + “” + maxTon + “” + minTon); 轉(zhuǎn)換MapString,Object public MapString, Object jsonToMap(String json){ MapString, Object map = new

    2024年02月20日
    瀏覽(21)
  • List<Map<String, Object>> 轉(zhuǎn)List<T> list map對(duì)象轉(zhuǎn)list對(duì)象

    List<Map<String, Object>> 轉(zhuǎn)List<T> list map對(duì)象轉(zhuǎn)list對(duì)象

    我們?cè)谔幚頂?shù)據(jù)的時(shí)候,經(jīng)常用到map對(duì)象轉(zhuǎn)java對(duì)象。 要轉(zhuǎn)換的對(duì)象 pom文件JSON包 : 如果此篇文章有幫助到您, 希望打大佬們能 關(guān)注 、 點(diǎn)贊 、 收藏 、 評(píng)論 支持一波,非常感謝大家! 如果有不對(duì)的地方請(qǐng)指正!!! 參考1 參考2

    2024年02月13日
    瀏覽(27)
  • List<Map<String, Object>>

    ListMapString, Object 是一個(gè)Java數(shù)據(jù)結(jié)構(gòu),它是一個(gè)列表(List),其中每個(gè)元素都是一個(gè)Map。在每個(gè)Map中,鍵(key)是字符串(String),值(value)可以是任何對(duì)象(Object)。 這種數(shù)據(jù)結(jié)構(gòu)通常用于存儲(chǔ)和處理一組相關(guān)的數(shù)據(jù)記錄。例如,可以使用ListMapString, Object 存儲(chǔ)數(shù)據(jù)庫(kù)查詢結(jié)果,其

    2023年04月21日
    瀏覽(24)
  • <List<Map<String,Object>>>循環(huán)List Map獲取里面的key和value,進(jìn)行操作

    輸出: Map循環(huán):(Value為Object)

    2024年02月12日
    瀏覽(91)
  • List<Entity>與Map<String, Entity>互轉(zhuǎn)

    List 轉(zhuǎn)為 MapString, Entity 要將 ListEntity 轉(zhuǎn)換為 MapString, Entity,你需要指定一個(gè)屬性作為 Map 的鍵,然后將 List 中的每個(gè)實(shí)體對(duì)象的該屬性值作為鍵,實(shí)體對(duì)象本身作為值放入 Map 中。以下是一個(gè)示例代碼: 假設(shè)你有一個(gè)名為 Entity 的實(shí)體類,其中有一個(gè)屬性名為 id ,你想將 Lis

    2024年04月22日
    瀏覽(23)
  • postman傳參之List<Map<String,Object>>后臺(tái)是map的集合

    postman傳參之List<Map<String,Object>>后臺(tái)是map的集合

    1.控制層 ? 2.業(yè)務(wù)層接口 ? 3.業(yè)務(wù)層實(shí)現(xiàn)類 ? 4.mapper ? 5.xml ? 6.運(yùn)行結(jié)果 ? 7.postman傳參格式 [{\\\"id\\\":127,\\\"age\\\":12,\\\"name\\\":30},{\\\"id\\\":232,\\\"age\\\":12,\\\"name\\\":30}]?

    2023年04月20日
    瀏覽(25)
  • 遍歷集合List的五種方法以及如何在遍歷集合過程中安全移除元素

    遍歷集合List的五種方法以及如何在遍歷集合過程中安全移除元素

    測(cè)試數(shù)據(jù) 1. 普通for循環(huán) 普通for循環(huán),通過索引遍歷 2. 增強(qiáng)for循環(huán) 增強(qiáng)for循環(huán),數(shù)組以及所有Collection集合都可以使用增強(qiáng)for循環(huán)遍歷。遍歷集合的實(shí)際原理為獲取集合的iterator迭代器對(duì)象進(jìn)行迭代遍歷。 3. Iterator迭代器遍歷 Collection接口繼承自Iterable接口,所有Collection集合都

    2024年02月13日
    瀏覽(21)
  • Java多條件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

    Java多條件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

    在Java中,對(duì)一個(gè)列表或集合進(jìn)行排序時(shí),經(jīng)常需要基于多個(gè)條件來排序。幸運(yùn)的是,Java提供了強(qiáng)大的 Comparator 接口,以及 thenComparing 方法,使我們能夠輕松地實(shí)現(xiàn)多條件排序。 Comparator 接口是Java用于自定義對(duì)象排序的關(guān)鍵接口。它包含了一個(gè) compare 方法,允許我們定義如何

    2024年02月04日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包