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

时间:2014-09-17 12:39:36

标签: java arrays list autoboxing

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

    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

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

enter image description here

我无法理解这种返回类型。 int[]是一个对象,而不是一个原始的,所以很好。我确定我没有得到List<Integer>(我期望的东西),但我不确定如何使用返回的东西。我的问题是:

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

5 个答案:

答案 0 :(得分:5)

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

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

好吧,List方法将完全按预期工作,List<T>是类型T的列表。此处Tint[],因此List<int[]>将包含每个元素的数组:

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

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

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

将是

[{210, 211, 212}]

所以

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

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

StringObject不是原始类型。不同之处在于。

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

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

请注意,使用Java 8,int[]List<Integer>的转换非常简单:

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

答案 1 :(得分:3)

您没有获得点亮或列表(不可能),您获得了整数数组列表。

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

阵列未展开&#34;展开&#34;进入列表,它被添加&#34;按原样#34;到新创建的列表。

所以:

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

答案 2 :(得分:3)

这是因为Arrays.asList()variadic通用函数。改变这个,

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

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

输出结果为truetrue

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

Arrays.asList(array)

等于

List<int[]> asList = Arrays.asList(array); 

更改

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