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. How To: Perl TCP / UDP Socket Programming using IO::Socket::INET

    http://www.thegeekstuff.com/2010/07/perl-tcp-udp-socket-programming/ In this article, let us discuss ...

  2. 用一个I/O口控制1个三色指示灯, 2个单色指示灯

    http://www.baiheee.com/Documents/081207/081207184434.htm http://www.baiheee.com/Documents/081207/081 ...

  3. 设置AD用户属性

    设置AD用户属性proxyaddresses的值 $test01 = [adsi]"LDAP://cn=test01,ou=oo,ou=admins,dc=ddv,dc=com" ...

  4. c# 轻量级 ORM 框架 之 DBHelper 实现 (三)

    周末了比较清闲,把自己的orm框架整理了下,开源了. 已经做出来的东西通常感觉有些简单,一些新手或许听到"框架"一类的词觉得有些"高深",简单来说orm就是把a ...

  5. imindmap7_windows_7.0

    思维导图工具: imindmap7_windows_7.0 iMindMap7.0 和谐包V1.0 22:27:23

  6. 【S4】使用empty()而不是判断size()是否为0

    1.二者的作用是一样的,结果也是等价的.就是判断集合是否为空. 2.二者是等价的,为什么强调使用empty,因为empty效率更高. 3.在STL中,对于一般的集合,empty和size都是常数时间. ...

  7. java学习笔记(5)——内部类

    一.内部类 1,静态内部类 使用static修饰,声明在类体中 静态内部类中可以访问外部类的静态成员 2,成员内部类 声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能 创 ...

  8. C++ Code_HotKey

            Code::使用HotKeyCtrl定义一个系统热键 // 关联HotKeyCtrl控件变量 m_HotKey1       BEGIN_MESSAGE_MAP(CXyzDlg, CD ...

  9. iOS开发——实战OC篇&环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)

      环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)   研究了这么就IOS开发,都没有所处一个像样或者自己忙一点的项目.最近自 ...

  10. PHP __autoload函数(自动载入类文件)的使用方法(转)

    详细出处参考:http://www.jb51.net/article/29625.htm 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进 ...