前言

平时最常用的莫过于ArrayListHashMap了,面试的时候也是问答的常客。先不去管容量、负载因子什么的,就是简单的使用也会遇到坑。

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会遇到的坑相关推荐

  1. [Java基础] Java中List.remove报错UnsupportedOperationException

    Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...

  2. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  3. Java 中ArrayList中的重复数据

    以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除 ...

  4. Java中List.remove报UnsupportedOperationException异常

    Java中List.remove报UnsupportedOperationException异常 参考文章: (1)Java中List.remove报UnsupportedOperationExcep ...

  5. Java中arraylist和数组的相互转换

    Java中ArrayList和数组之间的相互转换 ArrayList转为数组 数组转为ArrayList 一.ArrayList转换数组 public static void arrayListToA ...

  6. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  7. Java中ArrayList和LinkedList区别

    一般大家都知道ArrayList和LinkedList的大致区别:       1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.       2.对于随机 ...

  8. java中ArrayList与LinkedList的区别

    一.背景 面试题中经常会被面试官问到ArrayList和LinkedList的区别,下面从源码角度来对他们进行一下简单的阐述,相信会对它们有一个更全面深入的了解. 首先,ArrayList和Linke ...

  9. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度

    一般大家都知道ArrayList和LinkedList的大致区别:       1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.       2.对于随机 ...

最新文章

  1. 车牌检测识别--Towards End-to-End Car License Plates Detection and Recognition with Deep Neural Networks
  2. 三周第五次课) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间
  3. 二、创作网站 (三) Creating custom content types
  4. 大学计算机网络技术考试题,2017年大学生计算机考试的试题
  5. String是值传递还是引用传递
  6. unordered_map自定义key
  7. linux实验报告makefile,linux实验二交叉编译和Makefile实验报告.doc
  8. 无法读取项目文件 .csproj
  9. Overview of GTK+ and its Libraries
  10. linux vim打开乱码,linux下解决vim打开文件乱码现象
  11. Powershell为接收连接器批量添加RemoteIP地址
  12. VBA中的数据字典,可以理解为Java中的Map
  13. Mybatis-config.xml配置文件详解
  14. VMware虚拟机的安装与创建
  15. C4D建模宝典R20笔记
  16. java每日学习回忆录
  17. 如何搭建反欺诈策略与模型
  18. Struts1与Struts2的区别和对比(深度好文)
  19. mysql获取某个最大的值的一行数据_某一字段分组取最大(小)值所在行的数据
  20. android 圆形背景文字,android圆形图片,圆形背景文字的CircleTextImageView开源组件

热门文章

  1. Facebook人工智能副总裁:AI 这一领域很快就会「碰壁」
  2. 2019年上半年收集到的人工智能Python编程干货文章
  3. 今日看点:“靠脸进站”的刷脸系统究竟是如何实现的
  4. 机器视觉成熟技术,推进“机器换人”步伐。
  5. Python统计学-006:描述统计-方差
  6. 商业大佬提醒:如果不采取措施,美国在人工智能领域将落后于中国
  7. BAT面试题9:谈谈判别式模型和生成式模型?
  8. 干货丨揭秘深度学习的核心:掌握训练数据的方法
  9. 想用Python学机器学习?Google大神替你写好了所有的编程示范代码
  10. 四位专家谈:数字医学中的因果关系