Java中ArrayList remove会遇到的坑

List.remove()有两个:

        一个 public E remove(int index);

        一个 public boolean remove(Object o);

如果按照数组下标删除,则返回删除的值,

如果按照数组对象删除,则返回true or flase

这个方法是删除第一个Obejct

1.遍历移除list

public static void main(String[] args) {
    List<Integer> array = new ArrayList<>();
    array.add(0);
    array.add(1);
    array.add(2);
    array.add(3);
    array.add(2);
    array.add(4);
    array.remove(Integer.valueOf(2));  // 对象删除
   System.out.println(array);
}

输出结果 [0, 1, 3, 2, 4] ,这里是按照对象删除。

public static void main(String[] args) {
    List<Integer> array = new ArrayList<>();
    array.add(0);
    array.add(1);
    array.add(2);
    array.add(3);
    array.add(2);
    array.add(4);
    array.remove(2);  // 下标删除
    System.out.println(array);
}

输出结果 [0, 1, 3, 2, 4]这里是按照下标删除。

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);

结果是[1, 2, 5]

注意两点:integers.size()的大小会变化, remove 是按照数组下标来删除的,

        在移动的时候,单移除第一个2是,list数组会将后面所有的数据都向前移动一位,正好将第二个2先前移动了,没有遍历到。解决方法如下:

List<Integer> integers = new ArrayList<Integer>();
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()) {
    Integer next = iterator.next();
    if (next % 2==0) {
        iterator.remove();
    }
}
System.out.println(integers);

结果是[1, 5],使用迭代器来遍历。

2.经常会使用一个Arrays.asList的API, 那么下面的结果是什么:

List<String> list = Arrays.asList("a","b");
list.add("c");
System.out.println(list)
  • 报错: java.lang.UnsupportedOperationException

原因:

        为什么Java里的Arrays.asList()返回的List不能使用add、remove方法?

        通过源码我们发现,Arrays.asList()方法返回的ArrayList继承自AbstractList,同时实现了RandomAccess和Serializable接口。如下所示:

private static class ArrayList<E> extends AbstractList<E>  
implements RandomAccess, java.io.Serializable 

        问题就出在这里。这个ArrayList不是java.util包下的,而是 java.util.Arrays.ArrayList,显然它是Arrays类自己定义的一个内部类!这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。

那我们接着看这个AbstractList,定义如下:

public abstract class AbstractList<E> extends AbstractCollection<E> 
implements List<E> 

我们再来看一下里面的set,add,remove方法,定义如下:

public void add(int index, E element) {  
    throw new UnsupportedOperationException();  
}  
public E remove(int index) {  
    throw new UnsupportedOperationException();  
}  

全都返回了这个异常。

        总结:Arrays.asList()返回的ArrayList继承自AbstractList,它仅支持那些不会改变数组大小的操作,所以任何对底层数据结构的尺寸进行修改的方法都会出现异常,Arrays.asList()返回固定尺寸的List。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的IT蜗牛

更美口味,打赏人生

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值