Wygląda na arraylist
to, że nie wykonuje swojego zadania w zakresie zmiany rozmiaru:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
Później, gdy próbuję uzyskać do niego dostęp:
list.get(5)
Zamiast zwracać 0, zgłasza IndexOutOfBoundsException: Indeks 5 poza zakresem dla długości 0 .
Czy istnieje sposób na zainicjowanie wszystkich elementów do 0 o dokładnym rozmiarze, tak jak robi to C ++?
java
collections
Mróz
źródło
źródło
Odpowiedzi:
Liczba całkowita przekazana do konstruktora reprezentuje jego początkową pojemność , tj. Liczbę elementów, które może przechowywać, zanim będzie musiał zmienić rozmiar swojej wewnętrznej tablicy (i nie ma nic wspólnego z początkową liczbą elementów na liście).
Aby zainicjować listę z 60 zerami, wykonaj:
Jeśli chcesz utworzyć listę z 60 różnymi obiektami, możesz użyć interfejsu Stream API w
Supplier
następujący sposób:źródło
ArrayList
, a zamiast tego po prostu zaprogramowaćList
. To oczywiście decyzja pozostawiona OP.nCopies
jest niezmienna, więc utworzenie nowejArrayList
jest prawdopodobnie dobrym pomysłem.nCopies
obiektu z obiektem złożonym, kolekcja nie jest tworzona z 60 różnymi obiektami, ale 60 razy z tym samym obiektem. Więc używaj tego tylko dla prymitywów.nCopies
jest to przydatne w przypadku typów referencyjnych: niezmienne obiekty, takie jak ciągi znaków, wzorce obiektów null, stałe wyliczeniowe ... W każdym razie zaktualizowałem odpowiedź o rozwiązanie umożliwiające tworzenie 60 różnych obiektów.źródło
IndexOutOfBoundsException
zList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
tworzyList
, który nie pozwala na dodawanie ani usuwanie, więc nie jest dokładnie tym samym, czego chce OP. Zadziałałoby, gdyby wszystko, co musisz zrobić, toset
, ale w takim przypadku lepiej byłoby po prostu użyć tablicy.60, które mijasz, to tylko początkowa pojemność pamięci wewnętrznej. To podpowiedź, jak duże myślisz, że może być, ale oczywiście nie jest to ograniczone. Jeśli chcesz ustawić wartości, musisz ustawić je samodzielnie, np:
źródło
Implementacja Java 8 (lista inicjowana
60
zerami) :new int[N]
- tworzy tablicę wypełnioną zerami i długością Nboxed()
- każdy element opakowany w liczbę całkowitącollect(Collectors.toList())
- zbiera elementy strumieniaźródło
To nie tak. ArrayList po prostu używa tablicy jako wewnętrznej respentacji. Jeśli dodasz więcej niż 60 elementów, to tablica podkładania zostanie rozszerzona. Jakkolwiek możesz dodać tyle elementów do tej tablicy, ile masz pamięci RAM.
źródło