为了账号安全,请及时绑定邮箱和手机立即绑定

toArray 与预先确定的数组

toArray 与预先确定的数组

慕少森 2022-01-19 12:37:01
使用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
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

好问题。

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]) ——集合本身应该创建适当的存储。


查看完整回答
反对 回复 2022-01-19
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

它读取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甚至可能禁用检查投诉......在这些过时的设备上修复性能问题可能不值得付出努力 - 一些/大部分甚至可能不会受到影响,因为只有“早期更新”的行为与所有后续更新不同。


查看完整回答
反对 回复 2022-01-19
?
HUWWW

TA贡献1874条经验 获得超12个赞

我不是 Java 历史学家,但是...

HotSpot 似乎本质上是由 Oracle 维护和分发的特定类型 JVM 的品牌名称。它的名字来源于即时编译器,它可以检测频繁执行代码的“热点”并即时优化它们。

Android 运行时也具有这种 JIT 编译器行为,以及在安装时将 Java 字节码提前编译为本机机器码。

这让我认为 ART 与 HotSpot 属于同一类别(就此检查而言),因此您应该使用此调用的“空数组”版本。


如有疑问,请测量!

最好的确定方法是编写一个测试程序,该程序执行该方法的两个版本并测量哪个版本运行得更快。


资料来源:


查看完整回答
反对 回复 2022-01-19
  • 3 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信