[英]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>
(我期望的东西)但我不确定如何使用正在返回的东西。 我的问题是:
这里显然有3个问题,所以让我们一一解决它们:
- 当我期待一个 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
,而不是原始类型。 区别由此而来。
- 如果事情如此不确定,这种方法对原语有什么好处?
事情不是不确定的。 这种方法导致定义和可预测的行为。 它只是对原语不是很有用。 这是(又一个)将 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 };
并且输出将是true
和true
。
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.