ArrayList使用set或add方法添加指定元素抛出IndexOutOfBoundsException
来源:互联网 发布:支付宝java服务端demo 编辑:程序博客网 时间:2024/05/18 01:04
问题
- 直接使用arrayList通过add(int index,E e)添加指定位置的元素
ArrayList<String> array = new ArrayList<String>();array.add(1,"hello world");
- arraylist 调用clear()方法后通过set()指定位置的元素
ArrayList<String> array = new ArrayList<String>();array.add("hello");array.add("world");array.clear();array.set(2,"mitty");
上述两种情况都会出现IndexOutOfBoundsException,其实不单单是这两种情况,只要涉及到ArrayList中对index元素操作的方法都需要注意,下面就通过源码来分析原因。
原因
ArrayList生成对象如果不是集合copy,即:
public ArrayList(Collection<? extends E> collection){ ...}
也没有通过add按顺序添加元素或元素集合,即:
public boolean add(E object);public boolean addAll(Collection<? extends E> collection) ;
ArrayList中的size是不会发生变化的,所以在指定index的时候一般会先判断数组下标是否越界,如:
public void add(int index, E object) { //ArrayList中真正存取元素的数组,所以本质上说,ArrayList是数组的包装类。 Object[] a = array; //index反应数组真实元素个数,数组的大小比元素个数多。 int s = size; //这里会判断数组的大小是否越界 if (index > s || index < 0) { throwIndexOutOfBoundsException(index, s); } //小于size直接添加,大于则扩展数组的大小 if (s < a.length) { System.arraycopy(a, index, a, index + 1, s - index); } else { // assert s == a.length; Object[] newArray = new Object[newCapacity(s)]; System.arraycopy(a, 0, newArray, 0, index); System.arraycopy(a, index, newArray, index + 1, s - index); array = a = newArray; } a[index] = object; size = s + 1; modCount++; }
同样set(int index,E e)也会判断,但是开始添加了两个元素,那为什么第二种情况会发生呢?因为调用了clear()方法,clear方法会清空元素,并将size置为0,所以比较的时候就会;
public void clear() { if (size != 0) { Arrays.fill(array, 0, size, null); size = 0; modCount++; } }
扩容的规则
private static final int MIN_CAPACITY_INCREMENT = 12;private static int newCapacity(int currentCapacity) { int increment = (currentCapacity < (MIN_CAPACITY_INCREMENT / 2) ? MIN_CAPACITY_INCREMENT : currentCapacity >> 1); return currentCapacity + increment; }
结论
ArrayList实际上是数组的封装,而元素大小size是真实的反应ArrayList中元素的真实个数,元素的增加是按顺序增长的,size并不是数组的长度,所以在不确定ArrayList元素个数的情况下,需要先确定ArrayList的元素大小在去考虑对ArrayList指定元素的操作。
0 0
- ArrayList使用set或add方法添加指定元素抛出IndexOutOfBoundsException
- ArrayList.add()添加重复元素
- Java ArrayList add(index,element) 方法插入元素到数组指定位置
- Java ArrayList add(index,element) 方法插入元素到数组指定位置
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- Set集合中使用add方法添加对象
- ArrayList的add()方法使用
- 20161109 ArrayList set add方法 替换对应位置数据
- 使用ArrayList数组动态添加元素
- ArrayList删除指定元素
- set使用自定义元素方法
- ArrayList.add()添加一个元素后,会把前面一个元素覆盖
- ArrayList add()方法
- ArrayList add方法
- ArrayList添加元素流程
- HTML5调用手机摄像机、相册功能 <input>方法
- 启动eclipse报错 Could not create the Java Virtual Machine 解决办法
- 制作AppCan插件的那些坑
- mysql数据库索引
- php综合 提高php代码质量36计(中高级必会!)
- ArrayList使用set或add方法添加指定元素抛出IndexOutOfBoundsException
- 选择结构程序设计
- 声明:这学期之前一直事情很多,所以很多内容都先存在本地的,现在在一起发到博客上
- dubbox 2.8.4的配置和使用
- wpf下利用aforge,wpfmediakit和wincap调用usb摄像头简单分析
- 学习笔记:iOS布局库—MyLayout库之相对布局MyRelativeLayout
- 3. Longest Substring Without Repeating Characters
- Struts2详解
- xml工具类