import java.util.*;
public class test {
public static void main(String []args){
ArrayList<String> list = new ArrayList<String>();
list.add("how");
list.add("are");
list.add("you");
doubleList(list);
System.out.print(list.toString());
}
public static void doubleList(ArrayList<String> list){
for(int i = 0; i<list.size(); i++){
list.add(i*2,list.get(i*2) );
}
}
}
编译报错
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at test.doubleList(test.java:20)
at test.main(test.java:14)
我手动添加也没有发现越界啊list.add(0, "how");
list.add(2,"are");
list.add(4,"you");
求真相
public class test {
public static void main(String []args){
ArrayList<String> list = new ArrayList<String>();
list.add("how");
list.add("are");
list.add("you");
doubleList(list);
System.out.print(list.toString());
}
public static void doubleList(ArrayList<String> list){
for(int i = 0; i<list.size(); i++){
list.add(i*2,list.get(i*2) );
}
}
}
编译报错
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at test.doubleList(test.java:20)
at test.main(test.java:14)
我手动添加也没有发现越界啊list.add(0, "how");
list.add(2,"are");
list.add(4,"you");
求真相
不是很清楚你要复制List的效果是什么,描述清楚一些
/**
* Checks if the given index is in range. If not, throws an appropriate
* runtime exception. This method does *not* check if the index is
* negative: It is always used immediately prior to an array access,
* which throws an ArrayIndexOutOfBoundsException if index is negative.
*/
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
}
楼主不要误会了,ArrayList底层是用数组实现的,初始化ArrayList底层首先会初始化长度为10的数组。
感觉上好像是没有越界,那只是对于底层数组而言。而已List的长度还是一样是3.
list.get(i*2)
所以楼主在这里取值的时候超出了List的范围而抛出来的。
楼主添加元素的时候,List对根据长度来自动判断“增加”List的长度。首先要明白List的出现是解决Array长度不可变的问题。
list.add(i*2,list.get(i*2) );原排列 0 1 2
要加到 3 4 5 位可程序中写成加到 0 2 4(注意 list.get(4)时候溢出。)
int size = list.size(); //计算原list大小。
使用list.add(i+size,list.get(i));
for(int i = 0; i<list.size(); i++){
list.add(i,list.get(i) );
list.add(i+1,list.get(i) );
}
}
这样不行吗?
public static void doubleList(ArrayList<String> list){
for(int i = list.size() - 1; i >= 0; i --){
list.add(i, list.get(i) );
}
稍微改了下可以使用了,但是还不是很理解。那个越界
public class Test{
public static void main(String []args){
ArrayList<String> list = new ArrayList<String>();
list.add("how");
list.add("are");
list.add("you");
doubleList(list);
System.out.print(list.toString()); }
public static void doubleList(ArrayList<String> list){
String[] strAry=new String[list.size()];
list.toArray(strAry);
// for(String s:strAry){
// System.out.println(s);
// }
for(int i = 0; i<strAry.length; i++){
list.add(i*2,strAry[i] ); } }
}
就是这样。
嗯,是酱紫的~~~ 注意取的位置。
3个数,只能取0 1 2
你在for(i为 0 1 2)
list.get(2 * i) 变成取0 2 4这三个位置的了,所以超出了,越界~~
import java.util.*;
public class test {
public static void main(String []args){
ArrayList<String> list = new ArrayList<String>();
list.add("how");
list.add("are");
list.add("you");
doubleList(list);
System.out.print(list.toString());
}
public static void doubleList(ArrayList<String> list){
int oldSize = list.size();
for(int i = 0; i<oldSize; i++){
list.add(i*2,list.get(i*2) );
}
}
}
本来你就是根据 初始的长度来进行计算插入的位置和对象 所以还是用传进来的arraylist的初始长度来计算!
越界是因为 你本来预计i的取值范围是0-2 但是每次添加了元素 长度都在变化,get(i*2)会导致 当 list.size()大于等于oldSize 就会越界
for(int i = 0; i<list.size(); i++){
list.add(i*2,list.get(i*2) );
}
额… 之前没注意看到。
你传参数list进来,第一轮for循环,list.size为3
然后add一个正常 又调list.size,大小变为4了
又add一个正常 又调list.size 大小又变5了。建议就用刚我写的
int size = list.size();
for(int i = 0; i < size; i++) for中的i范围不要这样不可定,不容易控制。
list.add(i*2,list.get(i*2) );
i为2时,至少第1个就为list.add(0, )就把原来的替换了。。
public static void doubleList(ArrayList<String> list)
{
int size = list.size();
for (int i = 0; i < size; i++)
list.add(i + size, list.get(i));
}
// 结果 [how, are, you, how, are, you]如果要再how how are are you you 排列的话,得再做相应调整