具有预先调整大小的阵列的阵列

2022-09-02 04:34:23

使用 Android Studio 3.2.1 时,会警告预先调整大小的数组,并建议使用空数组ar.toArray(new String[ar.size()])

将集合转换为数组有两种样式:使用预先调整大小的数组(如 c.toArray(new String[c.size()]))或使用空数组(如 c.toArray(new String[0])。在较旧的Java版本中,建议使用预先调整大小的数组,因为创建适当大小的数组所必需的反射调用非常慢。然而,由于OpenJDK 6的后期更新,这个调用是内延的,使得空数组版本的性能与预先调整大小的版本相同,有时甚至更好。此外,传递预先调整大小的数组对于并发或同步集合也是危险的,因为如果集合在操作期间并发收缩,则大小和 toArray 调用之间可能会发生数据争用,这可能会导致数组末尾出现额外的 null。这种检查允许遵循统一的风格:要么使用空数组(在现代Java中建议使用),要么使用预先调整大小的数组(在较旧的Java版本或非基于HotSpot的JVM中可能更快)。

这是真的 Android 还是只适用于 Java?

使用预先调整大小的数组(在较旧的Java版本或非基于HotSpot的JVM中可能更快)。

因为我认为Android是非HotSpot,它的虚拟机是Dalvik,现在是ART


答案 1

好问题。

https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array

底线:看起来更快,更安全,合同更干净,因此现在应该是默认的选择。未来的VM优化可能会缩小这种性能差距,使当前“被认为是最佳”的用法与实际的最佳用法相当。API 的进一步改进将遵循与集合本身相同的逻辑,即集合本身应创建适当的存储。toArray(new T[0])toArray(new T[size])toArraytoArray(new T[0])


答案 2

它读取并且使用哪个运行时来运行它并不重要 - 因为代码的语言级别(在Dalvik上作为编译类运行)可能是Java 6,7,8。它只关心项目用于编译它的语言级别。例如:since late updates of OpenJDK 6

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

设置甚至可能禁用检查投诉...修复这些过时设备上的性能问题可能不值得 - 有些/大多数甚至可能不受影响,因为只有“早期更新”的行为与所有后续更新不同。JavaVersion.VERSION_1_6