将列表作为可变参数传递[重复]
Posted
技术标签:
【中文标题】将列表作为可变参数传递[重复]【英文标题】:Passing a List in as varargs [duplicate] 【发布时间】:2012-08-26 13:34:20 【问题描述】:我有一个List<Thing>
,我想将它传递给声明为doIt(final Thing... things)
的方法。有没有办法做到这一点?
代码看起来像这样:
public doIt(final Thing... things)
// things get done here
List<Thing> things = /* initialized with all my things */;
doIt(things);
该代码显然不起作用,因为 doIt()
采用 Thing
而不是 List<Thing>
。
有没有办法将列表作为可变参数传递?
这是在 Android 应用程序中,但我不明白为什么该解决方案不适用于任何 Java
【问题讨论】:
【参考方案1】:只需传递things.toArray(new Thing[things.size()])
。
【讨论】:
应该是things.toArray(new Thing[things.size()]);
。
就可以了。 (是的,@Gray 是对的,传入适当大小的数组会更有效率。)
两者都可以@newacct,但我的建议不会创建必须立即进行 GC 处理的数组对象。
从 Java 6 及更高版本开始,执行things.toArray(new Thing[0])
通常性能更高。
@SLaks 来自 Intellij 重构建议“由于 OpenJDK 6 的后期更新,这个调用是内在的,与预调整大小的版本相比,空数组版本的性能相同,有时甚至更好。此外,传递预先确定大小的数组对于并发或同步集合也是危险的,因为在 size 和 toArray 调用之间可能会出现数据竞争,如果集合在操作期间同时收缩,这可能会导致数组末尾出现额外的空值。”此外,还有一个基准表明它更快:***.com/a/29444594/765419【参考方案2】:
可变参数在内部被解释为一个数组。因此,您应该事先将其转换为数组。同样在您的 doIt
方法中,您应该使用数组索引访问 things-s 元素。
【讨论】:
感谢您的快速回复。这很好用。您提到通过数组索引访问元素是有原因的,还是您可以这样做?没有理由不在 doIt() 中 for(Thing t : things),对吧? 我无法将您的答案和 SLaks 的答案都标记为正确,因此我认为您应该编辑他的答案,并添加有效的原因。然后我会做出正确的答案。抱歉,人们喜欢在答案中看到代码。 @xbakesx 你没有理由不能使用 for-each。 当然,增强的 for 循环将适用于数组。我只是强调了集合接口的方法在可变参数中不起作用,因为它是一个数组。以上是关于将列表作为可变参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章