java数组。asList()没有正常工作?
我有一个float[],我想得到一个包含相同元素的列表。我可以一个接一个地添加它们,但我想使用数组。asList方法。但有一个问题。这是有效的:
List<Integer> list = Arrays.asList(1,2,3,4,5);
但事实并非如此
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
asList方法接受varargs参数,据我所知,它是数组的“简写”
问题:
为什么第二段代码返回
List<int[]>
而不是List<int>
有办法纠正吗
为什么自动装箱在这里不起作用;i、 e.
int[]
到Integer[]
# 1 楼答案
虽然自动装箱会将
int
转换为Integer
,但不会将int[]
转换为Integer[]
为什么不呢
答案很简单(但并不令人满意),因为JLS就是这么说的。(如果您愿意,可以查看。)
真正的答案对于自动装箱的作用以及为什么它是安全的至关重要
当在代码中的任何地方自动装箱
1
时,都会得到相同的Integer
对象。并非所有int
值都是如此(由于Integer
自动装箱缓存的大小有限),但如果使用equals
来比较Integer
对象,您会得到“正确”的答案基本上
N == N
总是正确的,而new Integer(N).equals(new Integer(N))
总是正确的。此外,这两件事仍然是正确的。。。假设您坚持使用纯Java代码现在考虑一下:
这些是平等的吗?不
x == y
是假的x.equals(y)
是假的!但为什么呢?因为:换句话说,具有相同类型、大小和内容的两个数组总是可以区分的,因为Java数组是可变的
自动装箱的“承诺”是这样做是可以的,因为结果无法区分1。但是,由于数组的
equals
定义和数组的可变性,所有数组基本上都是可区分的。因此,如果允许对基元类型的数组进行自动装箱,这将破坏“承诺”1-。。。。。前提是不使用
==
测试自动装箱的值是否相等# 2 楼答案
这个怎么样
# 3 楼答案
输入Java 8,您可以执行以下操作以在盒式数组中进行收集:
或者把这个放进盒装清单里
然而,这只适用于
int[]
、long[]
和double[]
。这对byte[]
不起作用注意
Arrays.stream(ints)
和IntStream.of(ints)
是等价的。所以前面的两个例子也可以改写为:最后一种形式可能更受欢迎,因为它省略了
Stream
的原始特定亚型。然而,在内部,它仍然是一堆重载的,在本例中,这些重载仍然在内部创建一个IntStream