尝试克隆数组时出现 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);
}
我正在尝试克隆第一个数组。
它有时会抛出 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);
}