IntStream 和 Stream<Integer> 之间有什么区别?

alt*_*-f4 10 java

试图理解IntStream和之间的区别Stream<Integer>。我用下面的例子来说明:

int[] someInts = {1, 2, 3, 4, 5};
var intStream = Arrays.stream(someInts);
var streamInteger = Arrays.stream(someInts).boxed();
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?这种差异与性能有何关系?

And*_*eas 16

两者有什么区别?

IntStream是原始 值的流int

Stream<Integer>Integer 是一个对象流。

可用的操作列表不同,只需检查 javadoc 中的方法列表即可。例如,具有和 的IntStream内置概念,这并不是使用 using很难做到的,但它不是内置的。range(...)sum()sum()Stream<Integer>reduce()

差异与性能有何关系?

装箱和拆箱确实需要一些时间,但不是很多。许多临时装箱对象也会更频繁地触发垃圾收集,这也会消耗性能。所有这些加起来,因此如果流在紧密的“循环”中处理大量整数值,则差异可能是相关的。

更大的问题是空间,因为开销Integer相当大。Anint是值的 4 个字节,而 anInteger是引用的 4 个字节加上对象的 16 个字节,因此Integer每个值使用 20 个字节,即内存的 5 倍。

如果您调用 ,这一点尤其重要,因为 an和 an之间在空间方面toArray()存在很大差异。int[]Integer[]