Java中ArrayList remove会遇到的坑
前言
平时最常用的莫过于ArrayList
和HashMap
了,面试的时候也是问答的常客。先不去管容量、负载因子什么的,就是简单的使用也会遇到坑。
Remove 元素
经常遇到的一个场景是:遍历list, 然后找到合适条件的给删除掉,比如删除所有的偶数。
@Test
public void testRemove2(){List<Integer> integers = new ArrayList<>(5);integers.add(1);integers.add(2);integers.add(2);integers.add(4);integers.add(5);for (int i = 0; i < integers.size(); i++) {if (integers.get(i)%2==0){integers.remove(i);}}System.out.println(integers);
}
看起来好像没问题,加入面试的时候当面问:输出结果是什么?再问真不会报错吗?再问结果是什么?
- 报错
- 结果是空list
- 结果是[1, 2, 5]
List.remove()有两个,一个public E remove(int index)
,一个是public boolean remove(Object o)
,那下面的结果是什么:
@Test
public void testRemove(){ArrayList<Integer> integers = Lists.newArrayList(1, 2, 3, 4);System.out.println(integers);integers.remove(1);System.out.println(integers);
}
- [1, 3, 4]
经常会使用一个Arrays.asList的API, 那么下面的结果是什么:
@Test
public void testRemove3(){List<String> list = Arrays.asList("a","b");list.add("c");System.out.println(list);
}
- 报错: java.lang.UnsupportedOperationException
使用foreach是否可以实现刚开始的问题
@Test
public void testRemove4(){List<String> strings = new ArrayList<>();strings.add("a");strings.add("b");strings.add("c");strings.add("d");for (String string : strings) {strings.remove(string);}
}
- 否,报错java.util.ConcurrentModificationException
为了性能问题,我们推荐把list.size的计算提取出来
@Test
public void testRemove5(){List<String> strings = new ArrayList<>();strings.add("a");strings.add("b");strings.add("c");strings.add("d");int size = strings.size();for (int i = 0; i < size; i++) {strings.remove(i);}}
- 报错: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
- 这是很好的习惯, 不像开头那样每次循环都计算一次size,而且按这种情况还可以再运行的时候报错。文初的做法不报错,但结果并不是我们想要的。
使用Iterator是不是就可以remove了
@Test
public void testRemove6(){List<String> strings = new ArrayList<>();strings.add("a");strings.add("b");strings.add("c");strings.add("d");Iterator<String> iterator = strings.iterator();while (iterator.hasNext()){String next = iterator.next();strings.remove(next);}System.out.println(strings);
}
- 报错: java.util.ConcurrentModificationException
正确的remove做法是什么
@Test
public void testRemove7(){List<String> strings = new ArrayList<>();strings.add("a");strings.add("b");strings.add("c");strings.add("d");Iterator<String> iterator = strings.iterator();while (iterator.hasNext()){String next = iterator.next();iterator.remove();}System.out.println(strings);
}
Java中ArrayList remove会遇到的坑相关推荐
- [Java基础] Java中List.remove报错UnsupportedOperationException
Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...
- java中ArrayList和LinkedList的区别
首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...
- Java 中ArrayList中的重复数据
以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除 ...
- Java中List.remove报UnsupportedOperationException异常
Java中List.remove报UnsupportedOperationException异常 参考文章: (1)Java中List.remove报UnsupportedOperationExcep ...
- Java中arraylist和数组的相互转换
Java中ArrayList和数组之间的相互转换 ArrayList转为数组 数组转为ArrayList 一.ArrayList转换数组 public static void arrayListToA ...
- Java中ArrayList源码分析
一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...
- Java中ArrayList和LinkedList区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机 ...
- java中ArrayList与LinkedList的区别
一.背景 面试题中经常会被面试官问到ArrayList和LinkedList的区别,下面从源码角度来对他们进行一下简单的阐述,相信会对它们有一个更全面深入的了解. 首先,ArrayList和Linke ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机 ...
最新文章
- 车牌检测识别--Towards End-to-End Car License Plates Detection and Recognition with Deep Neural Networks
- 三周第五次课) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间
- 二、创作网站 (三) Creating custom content types
- 大学计算机网络技术考试题,2017年大学生计算机考试的试题
- String是值传递还是引用传递
- unordered_map自定义key
- linux实验报告makefile,linux实验二交叉编译和Makefile实验报告.doc
- 无法读取项目文件 .csproj
- Overview of GTK+ and its Libraries
- linux vim打开乱码,linux下解决vim打开文件乱码现象
- Powershell为接收连接器批量添加RemoteIP地址
- VBA中的数据字典,可以理解为Java中的Map
- Mybatis-config.xml配置文件详解
- VMware虚拟机的安装与创建
- C4D建模宝典R20笔记
- java每日学习回忆录
- 如何搭建反欺诈策略与模型
- Struts1与Struts2的区别和对比(深度好文)
- mysql获取某个最大的值的一行数据_某一字段分组取最大(小)值所在行的数据
- android 圆形背景文字,android圆形图片,圆形背景文字的CircleTextImageView开源组件
热门文章
- Facebook人工智能副总裁:AI 这一领域很快就会「碰壁」
- 2019年上半年收集到的人工智能Python编程干货文章
- 今日看点:“靠脸进站”的刷脸系统究竟是如何实现的
- 机器视觉成熟技术,推进“机器换人”步伐。
- Python统计学-006:描述统计-方差
- 商业大佬提醒:如果不采取措施,美国在人工智能领域将落后于中国
- BAT面试题9:谈谈判别式模型和生成式模型?
- 干货丨揭秘深度学习的核心:掌握训练数据的方法
- 想用Python学机器学习?Google大神替你写好了所有的编程示范代码
- 四位专家谈:数字医学中的因果关系