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

10

我试图理解IntStreamStream<Integer>之间的区别。我将通过下面的示例进行说明:

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

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


1
这个回答解决了你的问题吗?IntStream相对于普通的Stream有什么优势? - Mingwei Samuel
2个回答

15
两者的区别是什么? IntStream 是一个基元类型为 int 的流。 Stream<Integer> 是一个包含 Integer 对象的流。
它们可用的操作列表不同,请查看 javadoc 中的方法列表。例如,range(...)sum() 是内置于 IntStream 中的概念,虽然使用 reduce() 也可以在 Stream<Integer> 中实现 sum(),但它没有内置。
这种差异与性能有何关系?
装箱和拆箱确实需要一些时间,但并不多。许多临时装箱对象还会触发垃圾收集,这也会降低性能。所有这些都会累加起来,因此,如果流在紧密的“循环”中处理大量整数值,则这种差异可能是相关的。
更大的问题是空间,因为 Integer 的开销相当大。一个 int 的值为 4 字节,而一个 Integer 的引用为 4 字节加上 16 字节的对象,因此,Integer 每个值使用 20 字节,即内存的 5 倍。
如果调用 toArray(),这一点尤其重要,因为在空间方面,int[]Integer[] 之间有很大的差异。

2

Stream<Integer> 操作的是装箱值(即 Integer 而非原始类型 int),这需要更多的内存,并通常涉及大量的装箱/拆箱操作(根据您的代码而定),而 IntStream 则适用于原始类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接