gpt4 book ai didi

java - 列出具有预定义大小或没有大小的可变参数

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:19 25 4
gpt4 key购买 nike

将 List 转换为可变参数以调用下面的“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()] ) )
这两者之间有显着差异吗?谢谢

最佳答案

据我了解

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

效率更高。原因:

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

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

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

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

当然list.size()被称为额外的。所以它可能会更慢。我对此表示怀疑。


更正

参见 Arrays of Wisdom of the Ancients .正确的基准显示相反:new String[0]更快。刚刚就飞过了很有意思的分析,貌似:

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

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

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

注意:

  • 代码检查员可能仍然有不同的想法并发出警告;
  • 这是热身:在热点 JIT 开始之前,情况可能是相反的。

关于java - 列出具有预定义大小或没有大小的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51766615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com