【问题标题】:What is the difference between IntStream and Stream<Integer>? [duplicate]IntStream 和 Stream<Integer> 有什么区别? [复制]
【发布时间】:2020-11-24 03:33:22
【问题描述】:

试图理解IntStreamStream&lt;Integer&gt; 之间的区别。下面我用一个例子来说明:

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

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

【问题讨论】:

标签: java


【解决方案1】:

两者有什么区别?

IntStream原始 int 值的流。

Stream&lt;Integer&gt;Integer 对象的流。

可用的操作列表不同,只需查看 javadoc 中的方法列表即可。例如。 IntStream 内置了range(...)sum() 的概念,并不是说sum() 很难用reduce() 处理Stream&lt;Integer&gt;,但它不是内置的。

差异与性能有何关系?

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

更大的问题是空间,因为Integer 的开销非常大。 int 是 4 个字节的值,而 Integer 是 4 个字节的引用加上 16 个字节的对象,所以 Integer 每个值使用 20 个字节,即内存的 5 倍。

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

【讨论】:

    【解决方案2】:

    Stream&lt;Integer&gt; 对装箱值(Integer 而不是原始 int)进行操作,这会占用更多内存,并且通常需要大量装箱/拆箱操作(取决于您的代码),而 IntStream 使用原件。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 2015-01-29
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2013-09-21
      • 2015-11-23
      相关资源
      最近更新 更多