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

Joe*_*oel 32 java arrays performance

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

将此视为场景:

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

选项1:

String[] out = new String[n];
for(int i = 0; i< n; i++)
    out[i]=in.get(i);
Run Code Online (Sandbox Code Playgroud)

选项2:

String[] out = (String[]) (in.subList(0, n)).toArray();
Run Code Online (Sandbox Code Playgroud)

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

src*_*369 41

假设:

列表 - 列表<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]);

  • `.limit(n).toList()` 工作得很好。 (3认同)
  • @jagamot 如果 N 小于数组大小,请改用“toArray(String[]::new)”。 (2认同)

Ell*_*sch 9

选项1比选项2更快

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

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

  • 令人惊讶的是,`subList`不会复制.它是现有列表的视图. (3认同)