Создать ArrayList с фиксированной длиной Java

У меня возникла проблема. Когда я создаю ArrayList, используя конструктор, где указывается длина, размер ArrayList всегда равен нулю.

ArrayList<Integer> d = new ArrayList<>(si + 1);

.

Log.d("e", String.valueOf(d.size()));

Вывод:

0

.

Log.d("e", String.valueOf(si + 1));

Вывод:

1

Подскажите, как правильно создать такой массив.

Весь метод:

    String[] sp = str.split(":");
    int s = Integer.parseInt(sp[0]);
    int f = Integer.parseInt(sp[1]);
    boolean j = Boolean.parseBoolean(sp[2]);
    if(j){
        int si = Integer.parseInt(sp[3]);
        ArrayList<Integer> d = new ArrayList<>(si + 1);
        for(int i = 0; i < si; i++){
            d.set(i, Integer.parseInt(sp[i + 4]));
        }
        return new Move(s, f, d);
    }
    return new Move(s, f);

Ответы (1 шт):

Автор решения: Nowhere Man

Когда я создаю ArrayList, используя конструктор, где указывается длина, размер ArrayList всегда равен нулю.

В конструкторе ArrayList(int initialCapacity) задаётся НЕ размер, а ёмкость создаваемого списка, чтобы слегка оптимизировать заполнение списка заранее известным количеством элементов. Сам же список создаётся пустым:

public ArrayList(int initialCapacity)
Constructs an empty list with the specified initial capacity.


Создать ArrayList с фиксированной длиной

ArrayList - по определению является реализацией интерфейса List на базе расширяемого массива:

Resizable-array implementation of the List interface.

Если задача состоит в том, чтобы создать список заданной длины, в который нельзя будет добавлять элементы, можно использовать метод Arrays.asList, для создания списка фиксированной длины, но для этого потребуется преобразовать массив строк в массив Integer при помощи Stream API, в частности получив поток "строк", начиная с нужного индекса при помощи Arrays.stream(T[] arr, int from, int to):

List<Integer> d = Arrays.asList(
    Arrays.stream(sp, 4, 4 + si)
          .map(Integer::parseInt)
          .toArray(Integer[]::new)
);

Или же можно воспользоваться вариантами коллекторов Collectors.toUnmodifiableList() (Java 10+) или Stream.toList (Java 16+) или Collectors.collectingAndThen + Collections.unmodifiableList (Java 8+):

List<Integer> java10 = Arrays.stream(sp, 4, 4 + si)
          .map(Integer::parseInt)
          .collect(Collectors.toUnmodifiableList());

List<Integer> java16 = Arrays.stream(sp, 4, 4 + si)
          .map(Integer::parseInt)
          .toList();

List<Integer> java8 = Arrays.stream(sp, 4, 4 + si)
          .map(Integer::parseInt)
          .collect(Collectors.collectingAndThen(
              Collectors.toList(), Collections::unmodifiableList
          ));
→ Ссылка