当我准备利用ArrayList的add(index,element)方法时遇到一个郁闷的结果。
废话不多说,show time
我现在需要满足一个需求,就是希望利用arrayList可以将本来的无序的元素添加到对应的index下
//初始化数组
ArrayList<String> arrayList = new ArrayList<>(5);
arrayList.add(3,"hello");
执行后:
java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)
at java.util.ArrayList.add(ArrayList.java:477)
at com.venustech.ingest.service.dao.DataIngestDaoTest.test1(DataIngestDaoTest.java:29)
ArrayList初始化源码
因为初始化的 arrayList 对象时,只初始化elementData内容,但是size没有修改对应大小,因为这个size只的是 elementData包含多少个数据,那就给elementData里面添加点东西吧,这样我就可以使用add(index,element)方法了
ArrayList<String> arrayList = new ArrayList<>(5);
for (int i = 0; i < 5; i++) {
arrayList.add("");
}
arrayList.add(3,"hello");
System.out.println(arrayList);
System.out.println(arrayList.size());
执行后的结果是
[, , , hello, , ]
6
长度还给我自动变长了??
上源码
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
这里面size累加了,
但是为什么添加到对应的位置,我却要再copy一份呢?直接调用elementData[index]=element 不就好了么??
如果换成数组
public void test1() {
String[] strs = new String[5];
strs[3]="hello";
System.out.println(strs.length);
System.out.println(strs[3]);
}
执行结果:
5
hello
是的,这才是正确的操作方式