java:了解基本类型的Arrays.asList(T … array)方法

我写了下面的代码,并惊讶地看到输出:

Integer a = 211; int b = 211; int[] array = {210,211,212}; System.out.println(Arrays.asList(array).contains(a)); System.out.println(Arrays.asList(array).contains(b)); 

输出:

 false false 

我发现这个问题和其他一些问题有关,并了解到asList方法不是Autobox的东西。 我在eclipse javadoc预览中检查了返回的类型:

在此处输入图像描述

我不太明白这种返回类型。 int[]是一个对象,而不是一个原语,所以很好。 我确定我没有得到List (我期望的东西),但我不知道如何使用返回的东西。 我的问题是:

    1.当我期待一个整数列表并获得一个int []列表时,我究竟期望列表方法能够正常工作吗?
    2.对于字符串,返回类型是字符串列表而不是字符串列表[]。 有什么样的实施差异?
    3.如果事情如此不确定,这种原始方法有什么用呢?

这里显然有3个问题,所以让我们一个一个地解决它们:

  1. 当我期待一个整数列表并获得一个int []列表时,我究竟期望列表方法能够正常工作吗?

好吧, List方法将完全按预期工作, List是类型T的列表。 这里T是一个int[]所以List将包含每个元素的数组:

 [{1, 2}, {3, 4}, {1, 6}] 

所以get(i)将返回第ith元素。 在Arrays.asList的情况下, List包含一个元素,即int[]所以:

 int[] array = {210,211,212}; List list = Arrays.asList(array); 

将会

 [{210, 211, 212}] 

所以

 list.get(0)[0] == 210 

对于字符串,返回类型是字符串列表而不是字符串列表[]。 有什么样的实施差异?

StringObject而不是基本类型。 差异来自于此。

  1. 如果事情如此不确定,这种原始方法有什么用呢?

事情并不确定 。 此方法导致定义可预测的行为。 它对于原语来说并不是很有用。 这是将Java类型系统与generics相结合的(又一个)副作用。

注意Java 8将int[]转换为List非常简单:

 List list = Arrays.stream(array). boxed(). collect(toList()); 

你没有得到一个Lit或一个List(不可能),你得到一个整数数组的List。

所以你的列表不包含211,它包含一个包含211的数组。

该数组不会“展开”到列表中,而是“按原样”添加到新创建的列表中。

所以:

 System.out.println(Arrays.asList(array).contains(array)); // Will return true System.out.println(Arrays.asList(a).contains(a)); // Will return true 

这是因为Arrays.asList()是一个可变参数generics函数。 改变这个,

 int[] array = {210,211,212}; 

 Integer[] array = { 210, 211, 212 }; 

输出将是true

Arrays.asList将对象作为参数。 由于int []是一个对象,因此您将获得List。 如果你想要一个整数列表,你应该做Arrays.asList(211,212,213)。

 int[] array = {210,211,212}; Arrays.asList(array) 

等于

 List asList = Arrays.asList(array); 

更改

int[] array = {210,211,212}; to Integer[] array = {210,211,212}; 它会起作用。 它等于List asList = Arrays.asList(array);