将List的前n个元素放入数组的最快方法

时间:2015-07-09 23:58:59

标签: java arrays performance

将列表的前n个元素存储在数组中的最快方法是什么?

将此视为情景:

int n = 10;
ArrayList<String> in = new ArrayList<>();
for(int i = 0; i < (n+10); i++)
  in.add("foobar");

选项1:

String[] out = new String[n];
for(int i = 0; i< n; i++)
    out[i]=in.get(i);

选项2:

String[] out = (String[]) (in.subList(0, n)).toArray();

选项3: 有更快的方法吗?也许使用Java8-streams?

5 个答案:

答案 0 :(得分:31)

假设:

列表 - 列出<String>

使用Java 8 Streams,

  • 将列表中的前N个元素放入列表中,

    List<String> firstNElementsList = list.stream().limit(n).collect(Collectors.toList());

  • 将列表中的前N个元素转换为数组,

    String[] firstNElementsArray = list.stream().limit(n).collect(Collectors.toList()).toArray(new String[n]);

答案 1 :(得分:8)

选项1比选项2更快

因为选项2创建了一个新的List引用,然后从n创建了一个List元素数组(选项1完美地调整了输出数组的大小)。但是,首先你需要修复一个bug。使用<(不是<=)。像,

String[] out = new String[n];
for(int i = 0; i < n; i++) {
    out[i] = in.get(i);
}

答案 2 :(得分:3)

这主要取决于n的大小。

如果n==0,没有什么比选项#1 :)

更好

如果n非常大,toArray(new String[n])会更快。

答案 3 :(得分:1)

选项3

迭代器比使用get操作更快,因为如果必须进行遍历,get操作必须从头开始。它可能不会对ArrayList产生影响,但是其他数据结构可能会看到明显的速度差异。这也与列表以外的东西兼容。

String[] out = new String[n];
Iterator<String> iterator = in.iterator();
for (int i = 0; i < n && iterator.hasNext(); i++)
    out[i] = iterator.next();

答案 4 :(得分:-2)

使用: Arrays.copyOf(yourArray,N);