当前位置: 首页 > news >正文

策划网站做推广的公司重庆解放碑

策划网站做推广的公司,重庆解放碑,积分购买 wordpress,网站建设与推广实训报告册看到这么标题可能觉得这个真是太easy了,不就remove吗,分分钟搞定。 但结果却出乎意料,下面我们来j简单说说list删除数据可能遇到的坑: 先说明我们可能会遇到的两个问题: 1.java.lang.IndexOutOfBoundsException(索引越…

看到这么标题可能觉得这个真是太easy了,不就remove吗,分分钟搞定。
但结果却出乎意料,下面我们来j简单说说list删除数据可能遇到的坑:
先说明我们可能会遇到的两个问题:
1.java.lang.IndexOutOfBoundsException(索引越界)
2.java.util.ConcurrentModificationException(并发修改异常)

开始测试:

首先初始化一个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>> 删除元素常见的误区* */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为张三的数据;

方式一:for i 循环 通过索引使用: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+"次循环删除成功");System.out.println("删除后长度:"+list.size());}System.out.println("方式一遍历:"+list.get(i));}

出现异常报错java.lang.IndexOutOfBoundsException(索引越界)
原因:每次循环删除元素之后,初始长度已发生变化,在最后一次循环出现越界
打印输出分析:
i:0
len:4
第0次循环删除成功
删除后长度:3
方式一遍历:{value=25, key=李四}
i:1
len:3
方式一遍历:{value=30, key=王五}
i:2
len:3
第2次循环删除成功
删除后长度: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循环: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);}

出现异常报错java.util.ConcurrentModificationException(并发修改异常)
通过源码分析:发现在 next、remove方法中都会调用checkForComodification 方法,
该方法的 作用是判断 modCount != expectedModCount是否相等,
如果不相等则抛出ConcurrentModificationException异常;
当我们调用 list.remove(item)时,对 list 对象的 modCount 值进行了修改;
而 list 对象的迭代器的 expectedModCount 值未进行修改;
所以就抛出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=王五}

简单总结:

1、用for循环遍历List删除元素时,需要注意索引变化(左移或右移)的问题(不推荐)。
2、List删除元素时,默认按索引删除,而不是对象删除(不推荐)。
3、List删除元素时,为避免陷阱,建议使用Stream流的filter方式(推荐)。
3、List删除元素时,为避免陷阱,建议使用迭代器iterator的remove方式(推荐)。

http://www.yayakq.cn/news/444661/

相关文章:

  • 福州 建站 软件网站的功能需求分析
  • 北京律师网站建设推荐临沂兰山网站建设
  • 酷虎云建站工具企业网站建设多钱
  • 清溪仿做网站今天大事件新闻
  • 厦门网站搭建wordpress 汉化 自适应
  • 南通网站开发价格网线制作方法
  • 网站关键词几个字河北省香河县建设局网站
  • 建材网站方案wordpress简易教程
  • 镇江建设局网站莱芜手机网站设计公司
  • 怎样将自己做的网站发布到外网上无锡网站建设公司排名
  • 被官方认可赚钱游戏北京网站运营优化公司
  • 广州网站建设兼职软件商店软件下载
  • 如何提升网站的权重田园综合体建设网站
  • 网站制作什么样的字体好看设计师在线
  • 点击立即进入正能量网站网站改备案信息吗
  • 深圳网站建设公司地址天元建设集团有限公司 企查查
  • 自己做的网站二维码怎么做的付费电影网站源码
  • 傻瓜式网站界面中国建设银行官网站基金查询
  • 购车网站设计保健品网站建设流程
  • 网站建设技术架构怎么做可以直播的网站
  • 做网站建设公司哪家好?《电子商务网站建设 》
  • 学校网站建设报价表网站移动端是什么问题吗
  • 网站 创意 方案app拉新一手渠道
  • 免费网站推广群发软件如何建设网站?
  • 织梦怎么关闭网站南沙门户网站建设
  • wordpress拷站从来没做过网站如何做
  • 长沙做网站竞网莱芜市网站建设设计
  • 网站运营维护措施有哪些鞍山最新通知今天
  • 手机网站搜索框代码dw用层还是表格做网站快
  • 哈密地网站建设淄博微信小程序代理