java - 列出具有预定义大小或没有大小的可变参数
问题描述
将 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()] ) )
.
这两者之间有显着差异吗?谢谢
解决方案
据我了解
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 启动之前,情况可能相反。
推荐阅读
- installation - Installshield :卸载以前版本并安装最新版本的自定义操作
- angularjs - Angular Json Http Get - 不加载
- javascript - 使用选择字段的值填充其他选择字段
- reactjs - BrowserRouter 未使用 url 参数打开
- ios - 金属计算着色器线程组和线程执行宽度
- c# - 我可以将信用卡数据存储在本地加密的 SQL Server 中吗
- c# - 在 Unity 应用程序中将日志发送到标准输出
- aix - 您将如何更换包含数据的坏磁盘(预测错误磁盘)?
- jquery - 空白输入:悬停在列表项中的字段 BG 颜色由 jQuery 设置
- c# - 时间:2018-10-10 标签:c#multiple binding label with string and data