Самый быстрый способ получить первые 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]) выполняется быстрее.