gpt4 book ai didi

java - 为什么 Collections.shuffle() 对我的数组失败?

转载 作者:IT老高 更新时间:2023-10-28 20:39:01 25 4
gpt4 key购买 nike

为什么我的代码不起作用?

package generatingInitialPopulation;

import java.util.Arrays;
import java.util.Collections;

public class TestShuffle {
public static void main(String[] args) {
int[] arr = new int[10];

for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}

Collections.shuffle(Arrays.asList(arr));

for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}

结果是:0 1 2 3 4 5 6 7 8 9。

我期待一个随机打乱的序列

最佳答案

Arrays.asList() 不能像您期望的那样应用于原始类型的数组。当应用于 int[] 时,Arrays.asList() 会生成 int[] 的列表,而不是 Integer< 的列表s。因此,您将一个新创建的 int[] 列表打乱。

这是 Java 中可变参数和泛型的一种微妙行为。 Arrays.asList() 被声明为

public static <T> List<T> asList(T... a)

因此,它可以接受多个 T 类型的参数并生成一个包含这些参数的列表,或者它可以接受一个 T[] 类型的参数并返回一个由这个数组支持的列表(这就是可变参数的工作方式)。

但是,后一种选项仅在 T 是引用类型(即不是原始类型,例如 int)时才有效,因为只有引用类型可以用作类型泛型中的参数(并且 T 是类型参数)。

所以,如果你通过 int[],你会得到 T = int[],而你的代码不能按预期工作.但是如果你传递引用类型的数组(例如,Integer[]),你会得到 T = Integer 并且一切正常:

Integer[] arr = new Integer[10]; 

for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}

Collections.shuffle(Arrays.asList(arr));

for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}

关于java - 为什么 Collections.shuffle() 对我的数组失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com