Arrays.asList()。contains()在Double vs double数组上

时间:2014-01-14 17:56:16

标签: java arrays

我有一个双数组doubleArray1。我尝试了Arrays.asList().contains()操作,如下所示

double doubleArray1 [] = {1D,2D,3D};
if(Arrays.asList(doubleArray1).contains(1D)) {
    System.out.println("hello-1");
}

它不会打印任何内容。然后我把它变成了一个双数组

Double doubleArray1 [] = {1D,2D,3D};        
if(Arrays.asList(doubleArray1).contains(1D)) {
    System.out.println("hello-1");
}

打印hello-1

有人可以解释为什么会出现这种差异吗?

3 个答案:

答案 0 :(得分:8)

您第一次拨打Arrays.asList实际上是在返回一个List<double[]> - 它会自动将参数自动装箱,因为double[]不是T[] ...仿制药不会允许原始类型作为类型参数。

如果您想将double[]转换为List<Double>,您需要手动执行或使用第三方库来执行此操作。例如:

public List<Double> toList(double[] doubles) {
    List<Double> list = new ArrayList<>(doubles.length);
    for (double x : doubles) {
        list.add(x);
    }
    return list;
}

请注意,与Arrays.asList不同,对数组的任何后续更改都将反映在列表中,反之亦然 - 它是副本,而不是视图。

答案 1 :(得分:0)

Generic允许使用类型而非基本类型。因此,在将它与原语进行比较时,它并没有给出你的愿望,但是类型给你的结果。

答案 2 :(得分:0)

要添加到Jon的答案:asList采用vararg(变量arity)参数列表,并且vararg参数不会按照人们的预期方式自动进行。一个不涉及泛型的简单案例:

public void foo(Double... x) { whatever }

double[] doubleArray1 = {1D,2D,3D};

foo(doubleArray1);  // error

给出错误argument type double[] does not conform to vararg element type Double。这同样适用于asList;这里发生的事情是,因为Arrays.asList是通用的,你没有明确地给它通用类型,它会选择任何有用的东西; Double不起作用(出于同样的原因foo调用无法编译),double[]确实有效。这个表达式,你明确地给它通用参数,将在编译时给你相同的错误:

Arrays.<Double>asList(doubleArray1).contains(1D)