【发布时间】:2018-07-18 08:27:29
【问题描述】:
我通过这个创建了一个 randomIntStream:
final static PrimitiveIterator.OfInt startValue = new Random().ints(0, 60).iterator();
文档说这个流实际上是无穷无尽的。
我想了解在后台发生了什么。
ints(0,60) 正在生成无限的整数流。如果这是无限的,为什么我的机器没有泄漏任何内存?
我想知道,实际上真正生成了多少数字,这种实现是否会在流仍然结束的地方导致错误?或者这个流是否会不断地充满新的整数,因此它真的永远不会结束?
如果我已经问过这个问题,那么现在生成随机数的最佳实践是什么?
【问题讨论】:
-
数字(流中的元素)在需要时生成,然后立即再次被遗忘(除非收集在列表中,这可能是个坏主意)。
-
挑战与无限之美。您无法计算...根据您使用/存储这些数字的方式,您可以设法耗尽内存。但我想从技术上讲,您无法数出无限的数字,因为您必须等待无穷大……您必须在某个地方停下来
-
你不需要每次都创建一个新的Random,你可以使用
ThreadLocalRandom.current()为例。 -
这里使用“内存泄漏”是不正确的。如果在程序员不打算分配内存时分配内存,这只是内存泄漏。你应该说“为什么不消耗无限量的内存”......但是......当然不可能消耗无限量的内存。
-
@ernest_k 实际上,您可以计算一些(但不是全部)无穷大。这个概念被称为可数无限。
标签: java random java-stream