java 传递arraylist_关于java:如何将ArrayList传递给varargs方法参数?

基本上我有一个ArrayList的位置:

ArrayList locations = new ArrayList();

在此之下,我调用以下方法:

.getMap();

getMap()方法中的参数为:

getMap(WorldLocation... locations)

我遇到的问题是我不确定如何将locations的整个列表传递给该方法。

我试过了

.getMap(locations.toArray())

但是getMap不接受,因为它不接受Objects []。

现在,如果我使用

.getMap(locations.get(0));

它会完美地工作...但是我需要以某种方式传递所有位置...我当然可以继续添加locations.get(1), locations.get(2)等,但是数组的大小会有所不同。 我只是不习惯ArrayList的整个概念

最简单的方法是什么? 我觉得我现在不在考虑。

谨防Java自动将集合转换为参数数组?

源文章:将列表作为参数传递给vararg方法

使用toArray(T[] arr)方法。

.getMap(locations.toArray(new WorldLocation[locations.size()]))

(toArray(new WorldLocation[0])也可以,但是您会无故分配零长度的数组。)

这是一个完整的示例:

public static void method(String... strs) {

for (String s : strs)

System.out.println(s);

}

...

List strs = new ArrayList();

strs.add("hello");

strs.add("wordld");

method(strs.toArray(new String[strs.size()]));

//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...

就内存和速度而言,此操作的成本是多少?

@mindreader我认为它的表现是:O(n)

如果涉及其他模板,则没有警告就无法工作。例如。如果函数的长度超过几行,someMethod(someList.toArray(new ArrayList[someList.size()]))会给您一个非常烦人的警告(因为您可以禁止整个函数使用它,或者您必须在额外的步骤中创建数组并禁止显示警告。您存储它的变量。

显然,最快的方法是给零而不是数组大小。简而言之,这是因为编译时常数允许使用优化方法。 shipilev.net/blog/2016/arrays-wisdom-ancients

Java需要传播运算符:.getMap(...locations)

@JoshM。 Java需要做很多事情。 ;)我也(来自C#背景)错过了索引运算符。与使用Java中的HashMaps相比,在C#中使用字典的操作更为流畅。

@PerLundberg-完全同意。也是目前主要使用Java8的C#开发人员。也许10/11会更好。 :-P

Java 10+在局部变量推断方面略胜一筹,但诸如值类型之类的重大更改仍处于该语言的规划阶段。我真的希望有一天也能获得非擦除的泛型... :)(目前也在Java 8中,但正在向Java 11迈进)

gaaaaaaaaaaaaaaaaaaaaaaaaaaaa更多java伏都教。感谢您的回答!

在Java 8中:

List locations = new ArrayList<>();

.getMap(locations.stream().toArray(WorldLocation[]::new));

这是java巫毒教,但是更好的java(8)巫毒教..谢谢!

使用番石榴的可接受答案的简短版本:

.getMap(Iterables.toArray(locations, WorldLocation.class));

可以通过静态导入toArray进一步缩短:

import static com.google.common.collect.toArray;

// ...

.getMap(toArray(locations, WorldLocation.class));

您可以执行:getMap(locations.toArray(new WorldLocation[locations.size()]));或getMap(locations.toArray(new WorldLocation[0]));或getMap(new

WorldLocation[locations.size()]);

需要@SuppressWarnings(" unchecked")来删除ide警告。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值