使用Arrays.asList将基元数组转换为List

我有这个:

import java.util.Arrays; import java.util.ArrayList; public class Test1 { public static void main(String[] args) { double[] a = new double[2]; for( double d : Arrays.asList(a)) System.out.println(d); } } 

输出:

 $ javac Test1.java Test1.java:9: error: incompatible types for( double d : Arrays.asList(a)) ^ required: double found: double[] 1 error 

为什么我在这里收到错误?

错误是什么意思? 它告诉我什么?

你在这里得到一个错误,因为当你使用接受varargs的函数时,这个函数会在场景后面创建一个新的对象数组。 因此, Arrays.asList(1,2,3)实际上是一个整数数组
传入一个整数数组时, Arrays.asList()会在场景后面创建一个整数数组 。 这就是为什么你不能用以下循环迭代它:

 for( double d : Arrays.asList(a)) 

尝试改变它:

 for(double[] d : Arrays.asList(a)) 

你会看到d实际上是对你传递给Arrays.asList()的数组的引用 – a

在Java中,像List这样的集合只能引用引用类型double[]是一个基元数组(但数组本身是一个引用类型)。 因此, Arrays.asList正在尝试创建一个List ,如果你尝试for-each在该列表上,你将得到double[]数组而不是单个double值的项。

但是,您仍然可以在原始数组上使用for-each循环:

 for (double d : a) { System.out.println(d); } 

变量a类型为double[] ,而不是double

因此,调用Arrays.asList(a)将生成List ,而不是List 。 换句话说,列表中的每个元素都是double值的数组,而不是double值。

因此,迭代这样的列表将不会提取示例数组a的2个double值,而是提取单个double[]值,即数组a本身。

通过运行以下语句可以轻松validation:

 a = new double[2]; b = Arrays.asList(a); System.out.println(b.size()); 

上面的代码将打印1 ,validationb是一个只有1个元素的列表,数组a

要迭代自身的元素,可以直接运行

 for (double d : a) { System.out.println(d); } 

要创建a中所有double值的列表,每个值必须在添加到列表之前转换为Double对象,例如:

 List c = new ArrayList(); for (double d : a) { c.add(d); // Java automatically converts from double to Double }