资讯专栏INFORMATION COLUMN

Java中ArrayList remove会遇到的坑

LiangJ / 325人阅读

摘要:前言平时最常用的莫过于和了,面试的时候也是问答的常客。先不去管容量负载因子什么的,就是简单的使用也会遇到坑。元素经常遇到的一个场景是遍历然后找到合适条件的给删除掉,比如删除所有的偶数。文初的做法不报错,但结果并不是我们想要的。

前言

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

Remove 元素

经常遇到的一个场景是:遍历list, 然后找到合适条件的给删除掉,比如删除所有的偶数。

@Test
public void testRemove2(){
    List 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 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 list = Arrays.asList("a","b");
    list.add("c");
    System.out.println(list);
}

报错: java.lang.UnsupportedOperationException

使用foreach是否可以实现刚开始的问题
@Test
public void testRemove4(){
    List 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 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 strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    Iterator 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 strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    Iterator iterator = strings.iterator();
    while (iterator.hasNext()){
        String next = iterator.next();
        iterator.remove();
    }

    System.out.println(strings);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67643.html

相关文章

  • Arrays.asList存在的坑

    摘要:引语阿里巴巴开发规范说到使用工具类方法把数组转换成集合时不能使用其修改集合相关的方法它的方法会抛出我们来看一下为什么会出现这种情况问题分析我们做个测试被注释的三行可以分别解开注释运行后确实出现了规约中所说的异常我们来看下做了什么操作看上去是 引语: 阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/re...

    Pandaaa 评论0 收藏0
  • Java开发 大厂面试整理

    摘要:用户态不能干扰内核态所以指令就有两种特权指令和非特权指令不同的状态对应不同的指令。非特权指令所有程序均可直接使用。用户态常态目态执行非特权指令。 这是我今年从三月份开始,主要的大厂面试经过,有些企业面试的还没来得及整理,可能有些没有带答案就发出来了,还请各位先思考如果是你怎么回答面试官?这篇文章会持续更新,请各位持续关注,希望对你有所帮助! 面试清单 平安产险 飞猪 上汽大通 浩鲸科...

    Scorpion 评论0 收藏0
  • java常见十大误区

    摘要:根据拇指规则,最佳做法应该是尽量减少属性的访问级别。通常的,可变对象可用来避免产生过多的对象。如果类中定义了构造函数,那么编译器将不会给它插入默认构造函数。 1、转化数组为ArrayList 通常开发者转化数组为ArrayList的方式为 List list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList,而这个ArrayList...

    yintaolaowanzi 评论0 收藏0
  • 常见的集合容器应当避免的坑

    摘要:尽可能避免使用,会导致复制数组,降低效率。再额外提一点,我们常用的另一个容器也是推荐要初始化长度从而避免扩容。 showImg(https://segmentfault.com/img/remote/1460000019659723); 前言 前不久帮同事一起 review 一个 job 执行缓慢的问题时发现不少朋友在撸码实现功能时还是有需要细节不够注意,于是便有了这篇文章。 Arra...

    GraphQuery 评论0 收藏0
  • Java笔记-容器源码(持续更新)

    摘要:加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行操作即重建内部数据结构,从而哈希表将具有大约两倍的桶数。成员变量每个对由封装,存在了对象数组中。 虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 LinkedLis...

    mrli2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<