使用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 }