【问题标题】:What does "new Boolean[0]" or "new String[0]" in Java evaluate to [duplicate]Java中的“new Boolean [0]”或“new String [0]”评估为[重复]
【发布时间】:2020-02-03 14:28:36
【问题描述】:

new Boolean[0]new String[0] 在 Java 中的计算结果是什么?

为什么这里需要一个数字?

以下哪种方法是正确的?

myList.toArray(new Boolean[0])

myList.toArray(new Boolean[myList.size()])

【问题讨论】:

    标签: java arrays toarray


    【解决方案1】:

    引用 JetBrains IntelliJ IDEA 检查工具提示:

    将集合转换为数组有两种样式:使用 预先确定大小的数组(如 c.toArray(new String[c.size()]))或 使用空数组(如 c.toArray(new String[0])

    在 建议使用预先确定大小的数组的旧 Java 版本,因为 反射调用,这是创建适当大小的数组所必需的 很慢。但是,由于 OpenJDK 6 的更新较晚,因此此调用 被内化了,使得空数组版本的性能 与预尺寸的相比,相同,有时甚至更好 版本。此外,传递预定大小的数组对于并发或 作为数据竞争的同步收集是可能的 sizetoArray 调用可能会导致额外的空值 在数组的末尾,如果集合同时收缩 在操作过程中。

    此检查允许遵循 统一样式:使用空数组(推荐在 现代 Java)或使用预先确定大小的数组(在 较旧的 Java 版本或非基于 HotSpot 的 JVM)。

    【讨论】:

      【解决方案2】:

      表达式new Boolean[0]为一个长度为0的新数组对象分配内存。

      当您调用myList.toArray(...) 时,toArray() 方法将首先检查您提供的数组是否足够大。如果不是,则该方法将分配一个足够大的新数组。

      因此,当您调用myList.toArray(new Boolean[0]) 时,您正在分配一个新数组,然后在分配另一个新数组后立即分配,然后垃圾收集器可以释放第一个(无用的)数组。

      当您调用myList.toArray(new Boolean[myList.size()]) 时,您分配了一个必要大小的数组,然后填充它。这在内存使用和 CPU 时间方面都更有效。我总是在方便的时候使用这种模式。

      【讨论】:

      • 分配正确大小的数组其实不一定效率更高。当您分配一个数组而不列出其初始元素时,通常必须在使用该数组之前填充默认初始值,以防止它处于无效状态。如果创建数组的代码立即用其他值填充它而不访问处于无效状态的数组,并且编译器可以证明它这样做了,那么用默认初始值填充数组的第一阶段值可以被优化掉。 toArray 方法中的代码可证明是...
      • ... 以这种方式优化是安全的,因为它使用了System.arraycopy,但是代码myList.toArray(new Boolean[myList.size()]) 以这种方式优化并不安全,因为List.toArray 可以被一个实现覆盖在写入之前从数组中读取。请参阅 this answer 进行经验性能比较。
      • 关于编译器优化 toArray() 方法本身的潜力的要点。
      【解决方案3】:

      数组大小

      new Boolean[0] 创建一个零元素数组。

      相反

      new Boolean[myList.size()] 创建一个大小为 myList 的数组。

      使用什么

      在过去,您应该使用new Boolean[myList.size()],因为这样更有效。

      第一个选项意味着您要传递一个大小为零的数组,该数组将被丢弃以创建一个新数组。

      但是,正如 Eng.Fouad 所写的使用 InteliJ 文档,在最新版本中不再是这种情况

      【讨论】:

        猜你喜欢
        • 2017-10-27
        • 2018-08-16
        • 2011-04-07
        • 2016-08-25
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 2018-01-22
        相关资源
        最近更新 更多