首页 > 解决方案 > 列出具有预定义大小或没有大小的可变参数

问题描述

将 List 转换为 varargs 以在 'builder(String...s)' 方法下调用的更好方法是什么。

builder( stringList.toArray( new String[stringList.size()] ) );//with pre-difined array size

或者

builder( stringList.toArray( new String[0] ) );//without predifined size

例如

void test() {

  List<String> stringList = new ArrayList<>();
  builder( stringList.toArray( new String[stringList.size()] ) );//call builder method with pre-difining array size
  builder( stringList.toArray( new String[0] ) );//call builder method with array size 0

}

void builder( String... s )
{

}

我在评论中遇到了这个问题,有人建议我builder( stringList.toArray( new String[0] ) )比使用builder( stringList.toArray( new String[stringList.size()] ) ).
这两者之间有显着差异吗?谢谢

标签: javaarrays

解决方案


据我了解

stringList.toArray( new String[stringList.size()] ) )

效率更高。原因:

该参数需要具有String泛型的实际类型 () List<String>,其中泛型类型参数在运行时被擦除。

如果其大小与列表大小匹配,则该参数用于结果数组。

如果大小为 0,则丢弃传递的数组。

所以传递一个正确的数组可以节省一个对象的创建。

当然list.size()叫extra。所以可能会慢一些。我对此表示怀疑。


更正

参见远古智慧阵列。一个正确的基准显示了相反的结果:new String[0]更快。我刚刚跳过了非常有趣的分析,似乎:

  • (额外的短暂寿命new String[0]无关紧要;)
  • 在 toArray 方法中进行本地数组复制允许不同的、更快的数组复制;
  • (然后有额外的调用size。)

请注意,我没有足够彻底地阅读这篇文章;这真的很有趣。

结论(违反直觉):new T[0]更快。

请注意:

  • 代码检查员可能仍会以不同的方式思考并发出警告;
  • 这是热身:在热点 JIT 启动之前,情况可能相反。

推荐阅读