关于arraylist.remove的一些小问题。
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的一些小问题。的更多相关文章
- JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...
- ArrayList中的一些小细节@JDK8
ArrayList中的一些小细节@JDK8 protected transient int modCount = 0; 该变量用于记录ArrayList的版本号,不可被序列化,每次对ArrayList ...
- List<Integer>.remove()的一个小细节
不废话,先上代码: ArrayList<Integer> col = new ArrayList<Integer>(); System.out.println("In ...
- Java中ArrayList remove会遇到的坑
前言 平时最常用的莫过于ArrayList和HashMap了,面试的时候也是问答的常客.先不去管容量.负载因子什么的,就是简单的使用也会遇到坑. Remove 元素 经常遇到的一个场景是:遍历list ...
- C# ArrayList的使用方法小总结
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- 为什么ArrayList remove报错
不报错 List<String> userNames = new ArrayList<String>() {{ add("Hollis"); add(&qu ...
- ArrayList remove注意事项
例子1: List<Integer>list=new ArrayList<>(); list.add(1); list.add(2); list.add(2); list.ad ...
- java ArrayList remove 2 及正确方法
https://www.cnblogs.com/chrischennx/p/9610853.html 正确方式 方法一,还是fori,位置前挪了减回去就行了, remove后i--: public v ...
- java ArrayList remove
packimport java.util.ArrayList;import java.util.List; public class ArrayListRemove { public static v ...
随机推荐
- Extjs Google的Suggest的自动提示 从后台取数据
//服务器取数据 var remoteStore = Ext.create('Ext.data.Store', { proxy: ({ type: "ajax", url:&quo ...
- C#实现Combobox自动匹配字符
不多说了,如图,应客户要求,下拉框中需要自动匹配字符,可能有些人一早就对此很熟,但相对于我还是首次使用,还是花了一点时间,现记录下来,也希望能帮助大家更好的理解. 首先要设定Combobox的Drop ...
- C# 绘制统计图(柱状图, 折线图, 扇形图)
统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的:这里我们用 ...
- Uva 10167 - Birthday Cake 暴力枚举 随机
Problem G. Birthday Cake Background Lucy and Lily are twins. Today is their birthday. Mother buys ...
- Python 存储模型
1.Python彻底分离了对象和引用,可以认为内存中的对象都是不可修改的,每次修改引用,相当于在堆上重新创建一个对象,引用指向新对象. 2.对于数值和字符串,修改意味着引用指向一个新对象. 3.集合中 ...
- cdoj 80 Cube 水题
Cube Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/80 Descrip ...
- SQL 32位还原位64位出现3154错误
1:首先检查新建数据库的路径是否正确. 2:勾选覆盖原有数据库. 3:新建查询,选择master.然后新建查询中进行如下直接对bak文件的操作. RESTORE DATABASE TestFROM D ...
- progressBarButton
https://github.com/longtaoge/progressBarButton
- 为您的Android,iOS等应用加入声波传输功能
记得12年左右的时候,美国出现了chirp应用,该应用能够使用声波在iphone手机间传输文本,图片.甚至视频.当时认为非常高大上. 再后来,到13年的时候国内也出现了非常多声波应用.比方支付宝的声波 ...
- Network Link Conditioner模拟不同网络环境
在Xcode4.1中有一个工具叫Network Link Conditioner,可以让用户模拟不同的网络连接和带宽,可供Mac和iOS开发者测试自己的程序在不同网络环境下的表现. 在Xcode4.3 ...