Możesz ustawić początkowy rozmiar ArrayList, wykonując
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Jednak nie możesz tego zrobić
arr.add(5, 10);
ponieważ powoduje wyjątek poza zakresem.
Po co ustawiać początkowy rozmiar, jeśli nie masz dostępu do przydzielonego miejsca?
Funkcja dodawania jest zdefiniowana w ten add(int index, Object element)
sposób, więc nie dodam do indeksu 10.
set/add
pozycja n-1 .ArrayList
. Ja osobiście chciałbym metody, która pozwoliłaby mi ustawić taki rozmiar, żebym mógł umieścić rzeczy według określonych wskaźników. Ta metoda wydaje się wyraźnie nieobecna.Odpowiedzi:
Mylisz rozmiar listy tablic z jej pojemnością:
Kiedy dzwonisz
new ArrayList<Integer>(10)
, ustawiasz początkową pojemność listy , a nie jej rozmiar. Innymi słowy, przy takiej konstrukcji lista tablic zaczyna życie pusta.Jednym ze sposobów dodania dziesięciu elementów do listy tablic jest użycie pętli:
Po wykonaniu tej czynności możesz teraz modyfikować elementy o indeksach 0..9.
źródło
while(arr.size() < 10) arr.add(0);
Przydatne może być stwierdzenie, że rozmiar musi wynosić co najmniej10
. np. możesz użyćarr.set(9, n);
Jeśli chcesz listę o zdefiniowanym rozmiarze, możesz także użyć:
źródło
List
jest pełen zer. Z Guava możemy to zrobić,Ints.asList(new int[10])
co zainicjuje naszą listę za pomocą0
s. Jednak czysty wzór, dzięki za przykład.ArrayList
jest implementacjąList
interfejsu iArrays.asList
zwraca anArrayList
. Proponuję spojrzeć na polimorfizm.UnsupportedOperationException
jeśli chcesz użyć Collections.fill (list, obj); w celu wypełnienia listy powtarzającym się obiektem można alternatywnie użyć
linia kopiuje 10 razy 0 do twojej ArrayList
źródło
Pojemność od
ArrayList
nie jest taka sama jak jego wielkości . Rozmiar jest równy liczbie elementów zawartych wArrayList
(i każdej innejList
implementacji).Pojemność tylko długość podstawowego matrycy, która jest stosowana do wewnętrznie przechowywania elementów
ArrayList
, i jest zawsze większy lub równy wielkości listy.Podczas wywoływania
set(index, element)
listyindex
odnosi się do faktycznej liczby elementów listy (= rozmiar) (która jest zerowa w kodzie, dlategoAIOOBE
jest wyrzucana), a nie do długości tablicy (= pojemność) (która jest specyficzna dla szczegółów implementacji doArrayList
).set
Metoda jest wspólna dla wszystkichList
implementacjach, takich jakLinkedList
, które nie są faktycznie realizowane przez tablicę, ale jako połączonego łańcucha wpisów.Edycja : Właściwie nie używasz tej
add(index, element)
metodyset(index, element)
, ale zasada jest tutaj taka sama.źródło
Jeśli chcesz dodać elementy z indeksem, możesz zamiast tego użyć tablicy.
źródło
10 to początkowa pojemność AL, a nie wielkość (która wynosi 0). Powinieneś wspomnieć o początkowej pojemności do jakiejś wysokiej wartości, gdy będziesz mieć wiele elementów, ponieważ pozwala to uniknąć narzutu związanego z rozszerzaniem pojemności w miarę dodawania elementów.
źródło
Chyba dokładna odpowiedź na twoje pytanie brzmiałaby:
Ustawienie rozmiaru początkowego na ArrayList zmniejsza liczbę. czasów, w których musi nastąpić ponowne przydzielenie pamięci wewnętrznej. Lista jest wspierana przez tablicę. Jeśli podasz np. Początkową pojemność 0, już przy pierwszym wstawieniu elementu konieczna będzie zmiana rozmiaru tablicy wewnętrznej. Jeśli masz przybliżone wyobrażenie o tym, ile elementów pomieści twoja lista, ustawienie początkowej pojemności zmniejszy liczbę. ponownego przydzielania pamięci podczas korzystania z listy.
źródło
To może komuś pomóc -
źródło
Spóźniam się z tym, ale po Javie 8 osobiście uważam, że to podejście z
Stream
API jest bardziej zwięzłe i może być alternatywą dla zaakceptowanej odpowiedzi .Na przykład,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
gdzie
size
jest pożądanyList
rozmiar i bez wspomnianej tutaj wady , wszystkie elementyList
są inicjowane jako0
.(Przeprowadziłem szybkie wyszukiwanie i nie znalazłem
stream
w żadnej opublikowanej odpowiedzi - daj mi znać, jeśli ta odpowiedź jest zbędna i mogę ją usunąć)źródło
W tej chwili nie ma żadnych elementów na liście, więc nie można dodać do indeksu 5 listy, jeśli nie istnieje. Mylisz pojemność listy z jej obecnym rozmiarem.
Zadzwoń:
aby dodać liczbę całkowitą do ArrayList
źródło
Chociaż twoja arraylist ma pojemność 10, prawdziwa lista nie zawiera tutaj elementów. Metoda add służy do wstawiania elementu do prawdziwej listy. Ponieważ nie ma żadnych elementów, nie można wstawić elementu do indeksu 5.
źródło
Jeśli chcesz dodać 10 elementów
ArrayList
, możesz spróbować:Jeśli już zadeklarowałeś zmienną rozmiaru tablicy, użyłbyś tej zmiennej
size
zamiast liczby „10”źródło
Miałem do czynienia z podobnym problemem i wiedząc, że arrayList jest implementacją tablicy List o zmiennym rozmiarze, spodziewam się również, że możesz dodać element do dowolnego punktu, ale przynajmniej mam możliwość zdefiniowania początkowego rozmiaru. W każdym razie możesz najpierw utworzyć tablicę i przekonwertować ją na listę taką jak:
lub
źródło
ArrayList myList = new ArrayList (10);
/ * Zadeklaruj, że początkowa pojemność arraylist to nic innego jak oszczędzanie czasu na zmiany; kiedy dodajemy element wewnętrznie, sprawdza on pojemność, aby zwiększyć pojemność, można dodać element początkowo o indeksie 0, a następnie 1 i tak dalej. * /
źródło
Moje dwa centy dalej
Stream
. Myślę, że lepiej jest używaćz elastycznością do wprowadzania dowolnych wartości początkowych.
źródło