public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
arr.remove(10); }
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10, Size: 5
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.remove(ArrayList.java:387)
at string.testArrayListRemove.main(testArrayListRemove.java:15)

对arr进行移除“10”这个元素时,报越界异常。

原因是传入的参数10被当成索引而不是要移除的元素。查阅api发现remove有两个方法

public E remove(int index)
移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。 public boolean remove(Object o)
移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。更确切地讲,移除满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引的元素(如果存在此类元素)。如果列表中包含指定的元素,则返回 true(或者等同于这种情况:如果列表由于调用而发生更改,则返回 true)。

下面这种操作方式就行了。

        ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
// arr.remove(10);
arr.remove((Integer)10);
        ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
int arrSize = arr.size();
for(int i = 0;i<arrSize;i++)
if(10 == arr.get(i))
arr.remove(i);

上面这段代码也执行不了,也报越界异常。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at string.testArrayListRemove.main(testArrayListRemove.java:17)
        ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(11);
System.out.println("删除前:"+arr.size());
for(int i = 0;i<arr.size();i++)
if(10 == arr.get(i))
arr.remove(i);
System.out.println("删除后:"+arr.size());

仔细看下执行结果:

删除前:10
删除后:7

arraylist进行remove操作会产生上面两种情况呢?

原因是每次remove后的size都会发生变化,但是迭代基数没有根据remove后的size动态调整,导致越界及集合遍历不完全。

正确方法如下:

        ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(11);
System.out.println("删除前:"+arr.size());
for(int i = 0;i<arr.size();i++){ if(10 == arr.get(i)){ arr.remove(i);
i--;
} } System.out.println("删除后:"+arr.size());

在remove操作后,将索引位置-1,

或者是用迭代器。

        ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 10;i<15;i++)
arr.add(i);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(11);
System.out.println("删除前:"+arr.size());
Iterator<Integer> it = arr.iterator();
while(it.hasNext()){
if(10 == it.next())
it.remove();
}

关于arraylist.remove的一些小问题。的更多相关文章

  1. JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习

    JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...

  2. ArrayList中的一些小细节@JDK8

    ArrayList中的一些小细节@JDK8 protected transient int modCount = 0; 该变量用于记录ArrayList的版本号,不可被序列化,每次对ArrayList ...

  3. List<Integer>.remove()的一个小细节

    不废话,先上代码: ArrayList<Integer> col = new ArrayList<Integer>(); System.out.println("In ...

  4. Java中ArrayList remove会遇到的坑

    前言 平时最常用的莫过于ArrayList和HashMap了,面试的时候也是问答的常客.先不去管容量.负载因子什么的,就是简单的使用也会遇到坑. Remove 元素 经常遇到的一个场景是:遍历list ...

  5. C# ArrayList的使用方法小总结

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  6. 为什么ArrayList remove报错

    不报错 List<String> userNames = new ArrayList<String>() {{ add("Hollis"); add(&qu ...

  7. ArrayList remove注意事项

    例子1: List<Integer>list=new ArrayList<>(); list.add(1); list.add(2); list.add(2); list.ad ...

  8. java ArrayList remove 2 及正确方法

    https://www.cnblogs.com/chrischennx/p/9610853.html 正确方式 方法一,还是fori,位置前挪了减回去就行了, remove后i--: public v ...

  9. java ArrayList remove

    packimport java.util.ArrayList;import java.util.List; public class ArrayListRemove { public static v ...

随机推荐

  1. iOS开发-HTTP请求

    什么是URL?URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URLURL的基本格式: URL中常见的协议 (1)HTTP 超文本传输协议,访问的是远程的网络资源,格式是http:// h ...

  2. STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...

  3. Java常见排序算法之快速排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. 局域网两台笔记本如何使用svn

    前几天我要和朋友一起开发一个网站,但是都是两台笔记本,连局域网搞的很麻烦,后来就用了git,今天突然想到要用svn,就在网上找了这个办法,结果一试便可以了,很开心 很感谢楼主,下面是我做的步骤绝对给力 ...

  5. [AngularJS] Best Practise - Minification and annotation

    Annotation Order: It's considered good practice to dependency inject Angular's providers in before o ...

  6. Lucene的Vint类型详解

    Lucene Vint压缩策略是,用每个字节的最高位做标志位,后7位为有效算术位,如果标志位为1,则说明后一个字节和当前字节是同一个数字,为0说明后一个字节是一个新的数字 Lucene源代码中进行存储 ...

  7. 使用SQL*PLUS,构建完美excel或html输出

    通过SQL*PLUS我们可以构建友好的输出,满足多样化用户需求.本例通过简单示例,介绍通过sql*plus输出xls,html两种格式文件.首先创建两个脚本:1.main.sql用以设置环境,调用具体 ...

  8. QQ群信息统计

    接口一: 1:QQ群信息统计 地址:http://localhost:8080/webServices/messageSort 注意:连接地址提交的是一个txt文件,返回是一个list的json字符串 ...

  9. JavaEE&Docker 容器示例

    准备:jboss.jdk.一个javaee的war包.Dockerfile 注:jboss和jdk可以不用提前准备好,在命令中wget也可以,因为我恰好有,就直接复制了 Dockerfile内容: # ...

  10. 3.2html学习笔记之图片

    <img src="" width="50%" alt="加载时候或无法显示时候显示的文字" height="让浏览器预先给 ...