Java 使用Arrays.asList将基元数组转换为列表

Java 使用Arrays.asList将基元数组转换为列表,java,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); } } 输出:

我有这个:

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
为什么我会在这里出错

错误的含义是什么?它告诉了我什么?

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

但是,您仍然可以对基本体数组上的每个循环使用:

for (double d : a) {
    System.out.println(d);
}
在Java中,像List这样的集合只能引用引用类型。double[]是基元数组,但数组本身是引用类型。因此,Arrays.asList正在尝试创建一个列表,如果您尝试为每个列表创建一个列表,您将得到双[]数组而不是单个双值的项

但是,您仍然可以对基本体数组上的每个循环使用:

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

这里出现了一个错误,因为当您使用接受varargs的函数时,该函数会在场景后面创建一个新的对象数组。实际上,Arrays.asList1,2,3获取一个整数数组。 传入整数数组时,Arrays.asList会在场景后面创建一个整数数组数组。这就是为什么不能使用以下循环对其进行迭代:

for( double d : Arrays.asList(a)) 
试着这样改变它:

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

您将看到,d实际上是对您传入array.asList-a的数组的引用。

您在这里遇到了一个错误,因为当您使用接受varargs的函数时,该函数会在场景后面创建一个新的对象数组。实际上,Arrays.asList1,2,3获取一个整数数组。 传入整数数组时,Arrays.asList会在场景后面创建一个整数数组数组。这就是为什么不能使用以下循环对其进行迭代:

for( double d : Arrays.asList(a)) 
试着这样改变它:

for(double[] d : Arrays.asList(a)) 
您将看到,d实际上是对您传递到array.asList-a中的数组的引用。

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

因此,调用Arrays.asLista将生成一个列表,而不是一个列表。换句话说,列表中的每个元素都是一个双值数组,而不是双值数组

因此,在这样的列表上迭代将不会提取示例数组a中的2个双精度值,而是提取单个双精度[]值,即数组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);
} 
若要从中创建所有双精度值的列表,必须先将每个值转换为双精度对象,然后再添加到列表中,例如:

List<Double> c = new ArrayList<Double>();
for (double d : a) {
    c.add(d); // Java automatically converts from double to Double
} 
变量a的类型为double[],而不是double

因此,调用Arrays.asLista将生成一个列表,而不是一个列表。换句话说,列表中的每个元素都是一个双值数组,而不是双值数组

因此,在这样的列表上迭代将不会提取示例数组a中的2个双精度值,而是提取单个双精度[]值,即数组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);
} 
若要从中创建所有双精度值的列表,必须先将每个值转换为双精度对象,然后再添加到列表中,例如:

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

因为ArraySList处理对象类型,正如您的标题所述。但是,在这种情况下,您无论如何都不需要ArraySlast,因为您可以迭代数组。您有一个double数组?为什么不只迭代该数组:forfinal double d:a{System.out.printlnd;}?因为ArraySlast适用于对象类型,正如您的标题所述。但是,在这种情况下,您不需要arraysalslist,因为您可以迭代数组。您有一个double数组?为什么不迭代该数组:forfinal double d:a{System.out.printlnd;}?@abc它告诉您,您需要double[],而不是double[];新的第二句和第三句解释得让你满意吗?@abc it告诉你,你需要的是Double[],而不是Double[];新的第二句和第三句解释得让你满意吗?你可以提到,这种行为只发生在原语数组中。引用类型的数组被正确处理。当然,但问题是关于基元数组。感谢和+1的评论,不过,在讨论中使用它是有用的-您可以提到,这种行为只发生在基元数组中。引用类型的数组被正确处理。当然,但问题是关于基元数组。谢谢你和+1的评论,不过,把它放进去是有用的
讨论:-感谢您提及使用varargs的函数如何工作的一般规则。感谢您提及使用varargs的函数如何工作的一般规则。