使用时ar.toArray(new String[ar.size()])
安卓工作室3.2.1警告预先确定大小的数组并建议空数组:
有两种方式将集合转换为数组:使用
预先确定大小的数组(如 c.toArray(new String[c.size()]))或使用
空数组(如 c.toArray(new String[0])。在较旧的 Java 版本中
建议使用预先确定大小的数组,因为反射调用是
创建适当大小的数组所必需的速度非常慢。然而
自从 OpenJDK 6 的最新更新以来,这个调用被内在化了,使得
空数组版本的性能相同,有时甚至
与预先调整尺寸的版本相比,效果更好。也通过预先尺寸
数组对于并发或同步集合来说是危险的
大小和 toArray 调用之间可能存在数据竞争,这可能
如果集合是,则会在数组末尾产生额外的空值
在手术过程中同时收缩。这项检查允许
遵循统一的风格:要么使用空数组(即
在现代 Java 中推荐)或使用预先确定大小的数组(可能是
在较旧的 Java 版本或基于非 HotSpot 的 JVM 中速度更快)。
对于Android 来说是这样还是仅仅对于java 来说是这样?
使用预先确定大小的数组(在较旧的 Java 版本中可能会更快)
或非基于 HotSpot 的 JVM)。
因为我认为 Android 不是 HotSpot,它的虚拟机是 Dalvik,现在是 ART
很好的问题。
https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array
底线: toArray(new T[0])
看起来更快、更安全、更符合合同
更干净,因此现在应该是默认选择。未来虚拟机
优化可能会缩小这种性能差距toArray(new T[size])
,
使当前“被认为是最佳”的用法与
实际上是最佳的一个。Further https://bugs.openjdk.java.net/browse/JDK-8060192 改进 http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2015-December/000047.html in toArray
API 会
遵循与以下相同的逻辑toArray(new T[0])
—— 收藏本身
应创建适当的存储。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)