2013-07-03 16 views
6

Buduję aplikację do czatu. Obecny Mam wszystkie wiadomości w numerze ArrayList, co pozwoliło mi pomyśleć - ile elementów ma być zaprojektowanych w stylu ArrayList? 100? 1.000? 10.000?Ilość elementów w ArrayList

+0

Uwaga na wątki. – SLaks

+0

Może to pomaga: http://www.coderanch.com/t/524745/java/java/Maximum-capacity-arrayList-String-objects –

+0

@MarounMaroun nie każdy ma wystarczającą liczbę przedstawicieli do zamknięcia. – CPerkins

Odpowiedz

11

ArrayList nie może pomieścić więcej niż Integer.MAX_VALUE elementów.

Tak więc 2147483647 to maks.

3

ArrayList może pomieścić dowolną liczbę elementów do Integer.MAX_VALUE - wynika to z decyzji projektowej dotyczącej wykorzystania typów danych int dla indeksów. Ważne jest jednak, jak przydzielasz pamięć - alokacja pamięci jest wolna - i jak przetwarzasz/uzyskujesz dostęp do elementów. Jednak od samego aspektu przechowywania jesteś ograniczony przez MAX_VALUE. W Javie jest to 2^31-1 = 2 147 483 647.

Do każdego normalnego zastosowania powinno wystarczyć. Jeśli jednak potrzebujesz więcej, możesz łatwo uzyskać kod źródłowy dla niego i zmodyfikować go, aby użyć long jako typ danych indeksu - a następnie być ograniczony przez Long.MAX_VALUE.

+0

Przyczyna nie wynika z wyboru indeksów int per se. Przyczyna jest spowodowana przechowywaniem listy implementacji List, która została wybrana ze względu na pożądaną (zamortyzowaną) algorytmiczną złożoność losowego dostępu do listy (która wymaga zachowania przypominającego tablicę). Z kolei ten magazyn wsparcia (tablica) ma to ograniczenie w języku Java/JVM. Można jednak zaimplementować interfejsy List, aby używać ujemnych indeksów, a także dać użytkownikowi 2^32 indeksów przy użyciu tego samego typu danych dla indeksu ('int'), na przykład za pomocą dwóch tablic i kilku dodatkowych obiektów jako rezerwowego sklepu zamiast z jednej tablicy. – user268396

+0

@ user268396 Wystarczająco fair, jednak nadal można uzyskać źródło dla 'ArrayList' i zmodyfikować go, aby zwiększyć maksymalny rozmiar do tego, co chcesz. Utwórz na przykład jego kopię 'Object [] []' i użyj 'long' jako indeksu - teraz jesteś ograniczony przez' Integer.MAX_VALUE^2'. –

+0

Oczywiście, ale moim bardziej ogólnym punktem jest to, że w twojej odpowiedzi (jak stwierdzono) rozumowanie pomija związek pomiędzy ograniczeniem implementacji i zachowaniem implementacji (wydajność/złożoność algorytmiczna).Gdy podjęte w wartości nominalnej, rozsądne pytanie kontynuacji byłoby: dlaczego w ogóle korzystać z ArrayList? Co jest dobre, jeśli wszystko, co może zrobić, to być bardziej ograniczoną wersją 'LinkedList'. Na co odpowiedź brzmi "złożoność algorytmiczna/wydajność", ale wtedy ograniczenie nie jest oczywiste ani wyjaśnione. :) – user268396

6

ArrayList, który jest wspierany przez tablicę i jest ograniczony do rozmiaru tablicy - tzn. Integer.MAX_VALUE.

Lista łączy nie jest ograniczona w ten sam sposób i może zawierać dowolną liczbę elementów.

zobaczyć podobne pytanie max. length of List in Java

How many data a list can hold at the maximum mieć inne aspekty dotyczące maksymalnej wielkości listy

+2

zobacz http://stackoverflow.com/questions/7632126/maximum-size-of-hashset-vector-linkedlist –

+0

Tak, widzę ...: P Nauczyłem się z tego, dzięki ...: D –

10

Wielkość ArrayList jest Integer.MAX_VALUE. Nie dlatego, że komentarze poprzedzające metodę List#size() mówią, że maksymalny rozmiar dowolnego List wynosi Integer.MAX_VALUE jak poniżej.

/** 
    * Returns the number of elements in this list. If this list contains 
    * more than <tt>Integer.MAX_VALUE</tt> elements, returns 
    * <tt>Integer.MAX_VALUE</tt>. 
    * 
    * @return the number of elements in this list 
    */ 
int size(); 

Jest dlatego ArrayList wykorzystuje szereg wewnętrznych i teoretycznie macierzy może być Integer.MAX_VALUE wielkości maksymalnie. Aby uzyskać więcej informacji, można zobaczyć this.

+0

To doesn w ogóle nie odpowiedzieć na pytanie. Rozmiar JavaDoc po prostu określa ograniczenie raportowania rozmiaru listy, mówi * nic * o maksymalnym rozmiarze listy. – SimonC

+0

Odpowiedź jest całkowicie myląca, JavaDoc "size()" nie wskazuje na maksymalny rozmiar jakiejkolwiek implementacji listy. – SimonC