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");
求真相

解决方案 »

  1.   

    数组越界的原因在于这一行list.add(i*2,list.get(i*2) );
    不是很清楚你要复制List的效果是什么,描述清楚一些
      

  2.   

    <=list.size(); 试一试 本人菜鸟 高手勿喷勿喷
      

  3.   

    <=list.size(); 试一试 本人菜鸟 高手勿喷勿喷
      

  4.   


    /**
         * 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长度不可变的问题。
      

  5.   

    效果就是原来是: ("how", "are","you")   变成("how","how","are","are","you", "you")
      

  6.   

     for(int i = 0; i<list.size(); i++){
           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));
      

  7.   

    public static void doubleList(ArrayList<String> list){
            for(int i = 0; i<list.size(); i++){
                list.add(i,list.get(i) );
                list.add(i+1,list.get(i) );
            }
            
        }
    这样不行吗?
      

  8.   


    public static void doubleList(ArrayList<String> list){
    for(int i = list.size() - 1; i >= 0; i --){
    list.add(i, list.get(i) );

    }
    稍微改了下可以使用了,但是还不是很理解。那个越界
      

  9.   

    这是根据楼主的意思实现的代码,请参考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){
            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] );        }    }
    }
      

  10.   

    list的长度是3,你现在去取索引为6的值。
    就是这样。
      

  11.   


    嗯,是酱紫的~~~  注意取的位置。  
    3个数,只能取0 1 2
    你在for(i为 0 1 2)
      list.get(2 * i) 变成取0 2 4这三个位置的了,所以超出了,越界~~
      

  12.   


    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 就会越界
      

  13.   

    我发现了,你们看是不是这样,本身这个for 循环的问题,判断条件因为执行list.add而不会终止,最后必会发现OutOfMemory错误,但我的程序在执行3次内是正确的,但却没有停止,在执行第四次时,list 的元素索引有0,1,2,3,4,5,  i*2=6(第四次i为3);所以是越界,问题在for循环的判断条件就是错的
      

  14.   

       public static void doubleList(ArrayList<String> list){
            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范围不要这样不可定,不容易控制。
      

  15.   

    明显错了 for(int i = 0; i<oldSize; i++){
                list.add(i*2,list.get(i*2) );
    i为2时,至少第1个就为list.add(0, )就把原来的替换了。。
      

  16.   

    效果就是原来是: ("how", "are","you") 变成("how","how","are","are","you", "you")最终:
    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 排列的话,得再做相应调整