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

are*_*res 7 java arrays autoboxing list

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

    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));
Run Code Online (Sandbox Code Playgroud)

输出:

false
false
Run Code Online (Sandbox Code Playgroud)

我发现了这个问题以及与之相关的一些其他问题,并了解到该asList方法不是Autobox的东西.我在eclipse javadoc预览中检查了返回的类型:

在此输入图像描述

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

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

Bor*_*der 5

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

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

嗯,List方法将完全按预期工作,a List<T>是类型列表T.这里T是一个int[]这样一个List<int[]>意愿包含数组作为每个元素:

[{1, 2}, {3, 4}, {1, 6}]
Run Code Online (Sandbox Code Playgroud)

所以get(i)将返回ith元素.在的情况下Arrays.asListList包含单个元件,即int[]这样:

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

将会

[{210, 211, 212}]
Run Code Online (Sandbox Code Playgroud)

所以

list.get(0)[0] == 210
Run Code Online (Sandbox Code Playgroud)

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

String是一种Object,而不是一种原始的类型.区别于此.

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

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

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

List<Integer> list = Arrays.stream(array).
        boxed().
        collect(toList());
Run Code Online (Sandbox Code Playgroud)