Arrays.asList()。contains()on Double vs double arrays

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

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

它不打印任何东西。 然后我把它变成了一个Double数组

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

它打印hello-1

有人能解释为什么会有这种差异

你第一次调用Arrays.asList实际上是返回一个List – 它是自动装箱参数,因为double[]不是T[] …generics不允许原始类型作为类型参数。

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

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

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

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

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

 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是通用的,你没有明确地给它generics类型,它会选择任何Arrays.asList东西; Double不起作用(出于同样的原因, foo调用将无法编译), double[]确实有效。 这个表达式,你明确地给它通用参数,将在编译时给你相同的错误:

 Arrays.asList(doubleArray1).contains(1D)