作者:手机用户2502859545 | 来源:互联网 | 2022-12-10 12:46
我已经创建了一个randomIntStream:
final static PrimitiveIterator.OfInt startValue = new Random().ints(0, 60).iterator();
文档说这个流实际上是无穷无尽的.
我想了解背景中发生了什么.
ints(0,60)
正在生成无限的整数流.如果这是无限的,为什么我的机器没有泄漏任何内存?
我想知道,实际上生成了多少个数字,以及这个实现是否会在流仍然结束时导致错误?或者这个流会不断地在飞行中充满新的整数,它真的永远不会结束吗?
如果我已经提出这个问题,那么现在生成随机数的最佳做法是什么?
1> Kayaman..:
流是无限¹所以您可以生成任意数量的整数而不会耗尽.这并不意味着当你不要求它时它会继续生成它们.
实际生成了多少个数字取决于您编写的代码.每次从迭代器中检索值时,都会生成一个值.没有在后台生成,因此没有使用"额外"内存.
¹就你的一生而言,请参阅Eran的回答
2> Eran..:
确切地说,
IntStream java.util.Random.ints(int randomNumberOrigin, int randomNumberBound)
收益:
一个有效无限的伪随机int值流,每个值符合给定的原点(包括)和绑定(不包括).
这并不意味着无限.查看Javadoc,您将看到一个实现说明,指出它实际上限制了返回IntStream
的Long.MAX_VALUE
元素:
实施说明:
实现此方法等同于int(Long.MAX_VALUE,randomNumberOrigin,randomNumberBound).
当然Long.MAX_VALUE
是一个非常大的数字,因此返回IntStream
可以被视为"有效"无限制.例如,如果int
每秒消耗该流的1000000 秒,则大约需要292471年才能耗尽元素.
也就是说,正如其他答案所提到的那样,IntStream
只产生其消费者所需的数量(即消耗int
s 的终端操作).