java - 我应该使用 java.util.Random 的全局实例,还是每次使用它时都构造一个?

标签 java random instance-variables

标题几乎概括了它。我看到人们在全局构造一个 Random 实例,并在他们所有的代码中使用它,我也看到人们每次想要使用 Random 时都构造一个实例。

我的问题是:如果有的话,我应该在什么时候构造一个新的 Random 实例来生成随机数?

Math.random() 将 Random 实例存储在 RandomNumberGeneratorHolder 中,并在每次调用 Math.random() 时调用它。

我的观点:我应该使用全局 Random() 实例,因为:

  1. 节省创建对象的时间。 Random() 的无参数构造函数调用 seedUniquifier(),它基本上永远循环直到找到新的 AtomicLong(),并将其提升到 System.nanoTime() 的幂。相当昂贵。
  2. 我目前正在为自定义 hashCode() 使用随机数。我覆盖了 equals(),现在我正在为 hashCode() 做同样的事情。我正在执行此操作的类将主要用于将数据存储在集合中,这严重滥用了 hashCode()。看到无参数 Random() 构造函数将花费比我用来生成哈希码的几次乘法更多的时间,它将使执行时间增加一倍以上。不好。

我想不出更多的理由,但如果我应该使用全局 Random 实例,我可以想象 Java 开发人员除了用于特殊情况的构造函数之外,还使用 ​​at 实例字段实现 Random。这告诉我我错了。我应该使用全局随机实例吗?

最佳答案

出于性能原因,您应该使用全局 Random 实例,而不是每次都初始化一个 - 另请参见 API .

请注意:

  • 对于多线程应用程序,您应该使用 ThreadLocalRandom相反,每次调用都采用 ThreadLocalRandom.current().next... 的形式(有关此事请参阅官方 recommendation)。
  • 对于密码安全的随机数,使用 SecureRandom反而。

关于java - 我应该使用 java.util.Random 的全局实例,还是每次使用它时都构造一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25200903/

相关文章:

java - 如何迭代table1的所有值(使用Java)?

java - 如何使用top linux计算java的实际内存使用情况?

java - 获取嵌套实体数据导致 stackoverflow 错误

java - 加权随机排序

PHP/MYSQL随机足球时间表

python - 如何在python中使用print显示类实例

ios - 在 UITableViewController 中为多个实例初始化结构的位置

Java Camel 框架 : Losing message body in processor

Java Math.random 闭双区间

java - 在Java中初始化ivars