toArray 与预先确定的数组

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

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

它适用于 Android 还是仅适用于 java?

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

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


慕少森
浏览 177回答 3
3回答

RISEBY

好问题。https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array底线:toArray(new T[0])似乎更快,更安全,合同更清洁,因此现在应该是默认选择。未来的 VM 优化可能会缩小这一性能差距toArray(new T[size]),使当前“被认为是最佳的”用法与实际最佳的用法相提并论。API的进一步 改进toArray将遵循相同的逻辑toArray(new T[0]) ——集合本身应该创建适当的存储。

慕码人2483693

它读取since late updates of OpenJDK 6并且使用哪个运行时来运行它并不重要 - 因为在 Dalvik 上作为编译类运行的代码的语言级别可能是 Java 6、7、8。它只关心哪种语言 -水平用于编译它的项目。例如:compileOptions {    sourceCompatibility JavaVersion.VERSION_1_8    targetCompatibility JavaVersion.VERSION_1_8}设置JavaVersion.VERSION_1_6甚至可能禁用检查投诉......在这些过时的设备上修复性能问题可能不值得付出努力 - 一些/大部分甚至可能不会受到影响,因为只有“早期更新”的行为与所有后续更新不同。

HUWWW

我不是 Java 历史学家,但是...HotSpot 似乎本质上是由 Oracle 维护和分发的特定类型 JVM 的品牌名称。它的名字来源于即时编译器,它可以检测频繁执行代码的“热点”并即时优化它们。Android 运行时也具有这种 JIT 编译器行为,以及在安装时将 Java 字节码提前编译为本机机器码。这让我认为 ART 与 HotSpot 属于同一类别(就此检查而言),因此您应该使用此调用的“空数组”版本。如有疑问,请测量!最好的确定方法是编写一个测试程序,该程序执行该方法的两个版本并测量哪个版本运行得更快。资料来源:https://en.wikipedia.org/wiki/HotSpothttps://en.wikipedia.org/wiki/Android_Runtime
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java