Самый быстрый способ получить первые n элементов списка в массив
Каков самый быстрый способ получить первые 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-потоками?
Ответы
Ответ 1
Вариант 1 быстрее, чем вариант 2
Поскольку опция 2 создает новую ссылку List
, а затем создает массив элементов n
из List
(параметр 1 отлично сортирует выходной массив). Однако сначала вам нужно исправить ошибку одним багом. Используйте <
(не <=
). Как,
String[] out = new String[n];
for(int i = 0; i < n; i++) {
out[i] = in.get(i);
}
Ответ 2
Предположение:
list - List <String>
Использование потоков Java 8,
-
чтобы получить первые 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]);
Ответ 3
В основном это зависит от того, насколько велика n
.
Если n==0
, ничто не сравнится с опцией # 1:)
Если n очень велико, toArray(new String[n])
выполняется быстрее.