繁体   English   中英

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

[英]java : Understanding Arrays.asList(T…array) method for primitive types

我编写了以下代码并惊讶地看到输出:

    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方法不会自动装箱。 我在 eclipse javadoc preview 中检查了返回的类型:

在此处输入图片说明

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

    1. 当我期待一个 Integer 列表并获得一个 int[] 列表时,我究竟希望列表方法如何工作?
    2. 在字符串的情况下,返回类型是字符串列表而不是字符串列表[]。 有什么样的实现差异?
    3. 如果事情如此不确定,这种方法对原语有什么好处?

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

  1. 当我期待一个 Integer 列表并获得一个 int[] 列表时,我究竟期望列表方法如何工作?

好吧, List方法将完全按预期工作, List<T>是类型T的列表。 这里T是一个int[]所以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

在字符串的情况下,返回类型是字符串列表而不是字符串列表[]。 有什么样的实现差异?

String是一个Object而不是原始类型。 区别由此而来。

  1. 如果事情如此不确定,这种方法对原语有什么好处?

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

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

List<Integer> 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()是一个可变参数泛型函数。 改变这个,

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

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

并且输出将是truetrue

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM