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

时间:2014-10-04 06:57:15

标签: java

我有这个:

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

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

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

3 个答案:

答案 0 :(得分:4)

在Java中,List之类的集合只能引用引用类型double[]是一个基元数组(但数组本身是一个引用类型)。因此,Arrays.asList正在尝试创建List<double[]>,如果您尝试在该列表上执行for-each,那么您将获得double[]数组而非单独double的项目1}}值。

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

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

答案 1 :(得分:2)

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

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

尝试改变它:

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

并且您会发现d实际上是对您传递到Arrays.asList() - a的数组的引用。

答案 2 :(得分:2)

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

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

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

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

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

以上代码将打印1,验证b是仅包含1个元素的列表,数组a

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

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

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

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