这个问题在这里已经有了答案:
intstream比普通流有什么优势(1个答案)上个月关门了。我在想 IntStream 以及 Stream<Integer> . 我用下面的例子来说明:
IntStream
Stream<Integer>
int[] someInts = {1, 2, 3, 4, 5}; var intStream = Arrays.stream(someInts); var streamInteger = Arrays.stream(someInts).boxed();
两者有什么区别?这种差异与绩效有何关系?
qhhrdooz1#
两者有什么区别? IntStream 是一股原始的 int 价值观。 Stream<Integer> 是一股 Integer 物体。可用的操作列表不同,只需检查javadoc中的方法列表。例如 IntStream 具有内置的 range(...) 以及 sum() ,不是那样 sum() 很难相处 Stream<Integer> 使用 reduce() ,但它不是内置的。这种差异与绩效有什么关系?装箱和拆箱确实需要一些时间,但不是很多。很多临时装箱的对象也会更频繁地触发垃圾回收,这也是性能消耗。所有这些加起来,所以如果流在一个紧密的“循环”中处理大量整数值,那么差异可能是相关的。更大的问题是空间,因为 Integer 相当大。一 int 值为4字节,而 Integer 引用是4字节,对象是16字节,所以 Integer 每个值使用20字节,即内存的5倍。如果你打电话来,这一点尤其重要 toArray() ,因为 int[] 和一个 Integer[] ,空间方面。
int
Integer
range(...)
sum()
reduce()
toArray()
int[]
Integer[]
mec1mxoz2#
Stream<Integer> 对装箱值进行操作( Integer 而不是原语int),后者占用大量内存,通常需要大量装箱/拆箱操作(取决于您的代码),而 IntStream 使用基本体。
2条答案
按热度按时间qhhrdooz1#
两者有什么区别?
IntStream
是一股原始的int
价值观。Stream<Integer>
是一股Integer
物体。可用的操作列表不同,只需检查javadoc中的方法列表。例如
IntStream
具有内置的range(...)
以及sum()
,不是那样sum()
很难相处Stream<Integer>
使用reduce()
,但它不是内置的。这种差异与绩效有什么关系?
装箱和拆箱确实需要一些时间,但不是很多。很多临时装箱的对象也会更频繁地触发垃圾回收,这也是性能消耗。所有这些加起来,所以如果流在一个紧密的“循环”中处理大量整数值,那么差异可能是相关的。
更大的问题是空间,因为
Integer
相当大。一int
值为4字节,而Integer
引用是4字节,对象是16字节,所以Integer
每个值使用20字节,即内存的5倍。如果你打电话来,这一点尤其重要
toArray()
,因为int[]
和一个Integer[]
,空间方面。mec1mxoz2#
Stream<Integer>
对装箱值进行操作(Integer
而不是原语int),后者占用大量内存,通常需要大量装箱/拆箱操作(取决于您的代码),而IntStream
使用基本体。