尝试克隆数组时出现 ArrayIndexOutOfBoundsExcetion

ArrayIndexOutOfBoundsExcetion when trying to clone an array

我正在尝试克隆第一个数组。 它有时会抛出 ArrayIndexOutOfBoundsExpection?为什么会发生这种情况,我该如何解决?

  import java.util.Random;
    
    public class CloneArray {
    
    
        public static void main(String args[]) {
            
             Random rand = new Random();
             
             int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
             int[] clone = arr;   
            
             for (int element: arr) {
                System.out.println(arr[element]);
             }
             
         System.out.println("---Clone the Array----");
             
             //clone the array 
             for (int ele: clone) {
                System.out.println(clone[ele]);
             }
        
        }
    }

在以下增强的 for 循环中,您正尝试像使用索引那样访问元素:

for (int element: arr) {
    System.out.println(arr[element]);
}

数组 arr 的最后一个元素可以是 16,因此对于这个值,arr[element] 将被转换为 arr[16],导致 ArrayIndexOutOfBoundsException .这是因为 arr[] 的大小是 16,因此 arr[] 中的最后一个索引是 15。当您尝试访问 clone[].

的元素时,情况类似

替换

System.out.println(arr[element]);
System.out.println(clone[ele]);

System.out.println(element);
System.out.println(ele);

修改后的代码如下:

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rand = new Random();

        int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
        int[] clone = arr;

        for (int element : arr) {
            System.out.println(element);
        }
        System.out.println("---Clone the Array----");
        for (int ele : clone) {
            System.out.println(ele);
        }
    }
}

或者,您可以使用索引样式访问数组中的元素:

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rand = new Random();

        int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
        int[] clone = arr;

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("---Clone the Array----");
        for (int i = 0; i < clone.length; i++) {
            System.out.println(clone[i]);
        }
    }
}

注意:您应该使用int[] clone = arr.clone()来克隆arr[]。当您执行 int[] clone = arr 时,数组引用 clone[] 将继续引用相同的元素,即 arr[] 的索引上的任何更改将在访问该索引上的值时以相同的方式反映clone[] 例如

import java.util.Arrays;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rand = new Random();
        int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
        int[] clone = arr;

        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(clone));

        arr[4] = 100;
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(clone));
    }
}

样本运行:

[1, 2, 3, 4, 4, 4, 6, 6, 7, 8, 9, 11, 13, 13, 14, 16]
[1, 2, 3, 4, 4, 4, 6, 6, 7, 8, 9, 11, 13, 13, 14, 16]
[1, 2, 3, 4, 100, 4, 6, 6, 7, 8, 9, 11, 13, 13, 14, 16]
[1, 2, 3, 4, 100, 4, 6, 6, 7, 8, 9, 11, 13, 13, 14, 16]

另一方面,

import java.util.Arrays;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rand = new Random();
        int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
        int[] clone = arr.clone();

        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(clone));

        arr[4] = 100;
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(clone));
    }
}

样本运行:

[1, 2, 2, 2, 2, 3, 6, 6, 7, 7, 11, 13, 14, 14, 14, 15]
[1, 2, 2, 2, 2, 3, 6, 6, 7, 7, 11, 13, 14, 14, 14, 15]
[1, 2, 2, 2, 100, 3, 6, 6, 7, 7, 11, 13, 14, 14, 14, 15]
[1, 2, 2, 2, 2, 3, 6, 6, 7, 7, 11, 13, 14, 14, 14, 15]

在 for 循环中 element 是数组的项目而不是它的索引。使用项目值作为索引有时会超过数组大小。结果基于您用来填充数组的随机值,因此只能随机重现。

要真正克隆数组,您应该使用.clone() 方法。 (请注意,这仅适用于一维数组。)对于 for each loop,您应该简单地打印 ele 而不是尝试将数组的元素用作索引。

int[] arr = new Random().ints(16, 1, 16 + 1).sorted().toArray();
int[] clone = arr.clone();  
//...
for (int ele: clone) {
   System.out.println(ele);
}