将列表的前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?
答案 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)
因为选项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);