使用ar.toArray(new String[ar.size()])
Android studio 3.2.1时,警告数组大小已预置,建议使用空数组
有两种方式可以将集合转换为数组:使用预置大小的数组(如c.toArray(
Stringc.size()或使用空数组(如c.toArray(新String) )。在较早的Java版本中,建议使用预置大小的数组,因为创建适当大小的数组所必需的反射调用相当慢。然而,由于OpenJDK 6的后期更新,此调用被内化,使得空数组版本的性能与预置大小的版本相同,有时甚至更好。此外,传递预置大小的数组对于并发或同步的集合是危险的,因为如果集合在操作期间同时收缩,则size和toArray调用之间可能会发生数据竞争,这可能会导致数组末尾出现额外的空值。这种检查允许遵循统一的风格:使用空数组(在现代Java中是推荐的)或使用预置大小的数组(在较早的Java版本或不基于热点的JVM中可能会更快)。
这是适用于Android还是只适用于java?
使用预先确定大小的数组(在旧的
版本或基于非HotSpot的JVM中,这可能会更快)。
因为我认为Android不是热点,它的虚拟机是Dalvik,现在它是艺术
发布于 2018-11-14 00:29:21
问得好。
https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array
底线:
toArray(new T[0])
看起来更快、更安全、合同更干净,因此现在应该是默认选择。未来的VM优化可能会缩小toArray(new T[size])
的这一性能差距,使当前的“被认为是最优的”使用与实际最优的使用情况相当。toArray
API中的Further improvements将遵循与toArray(new T[0])
- 相同的逻辑,集合本身应该创建适当的存储。
发布于 2018-12-17 04:48:55
它读取since late updates of OpenJDK 6
,并且使用哪个运行时来运行它并不重要-因为在Dalvik上作为编译类运行的代码的语言级别可能是Java6、7、8。重要的是项目使用哪个语言级别来编译它。例如:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
设置JavaVersion.VERSION_1_6
可能甚至会禁用检查投诉...在这些过时的设备上修复性能问题可能不值得努力-一些/大多数甚至可能不会受到影响,因为只有“早期更新”的行为与所有后续更新的行为不同。
发布于 2018-11-13 23:42:23
我不是Java历史学家但是..。
HotSpot似乎本质上是由甲骨文维护和分发的一种特定类型的JVM虚拟机的商标名称。它的名字来源于即时编译器,该编译器可以检测频繁执行的代码的“热点”,并对其进行动态优化。
Android Runtime也具有这种JIT编译器行为,以及在安装时将java字节码提前编译为本机代码。
这使我认为ART与HotSpot属于同一类别(就此检查而言),因此您应该使用此调用的“空数组”版本。
当有疑问的时候,测量一下!
确定的最好方法是编写一个测试程序,该程序执行方法的两个版本,并测量哪个版本运行得更快。
资料来源:
https://stackoverflow.com/questions/53284214
复制相似问题