2013-08-25 22 views
6

Witam wszystkich. Przygotowuję aplikację słowną, w której potrzebuję utworzyć List<String> (lub ArrayList). Aby to zrobić, mam stworzył następujący fragment kodu (tylko przykład):ArrayList automatycznie dodaje pozycje zerowe

List<String> tempSOLUTION = new ArrayList<String>(); 
String temp = "abc123"; 
tempSOLUTION.add(temp); 

Ja również próbowałem następujące:

tempSOLUTION.add(new String(temp)); 

Obaj dodać element do listy , ale podczas debugowania, uważam, że jest to tablica ma 12 obiektów, które są następujące:

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

Moim problemem jest to, że nie mogę mieć tych pustych elementów, jak ta nowa lista jest kluczem na HashableMap<String>, więc każdy zmiana będzie powodują wyjątek, ponieważ klucz NIE istniałby.

Zrzut ekranu z listy (tempSOLUTION) Szczegóły wykorzystaniem debuggera: http://www.pabloarteaga.es/stackoverflow.jpg

Jak mogę dodać element do listy bez tworzenia tych wszystkich pustych elementów?

Po szukał, znalazłem odpowiedź, w jaki sposób usunąć te elementy zerowe, czyli:

tempSOLUTION.removeAll(Collections.singleton(null)); 

Ale to nie działa dla mojego celu.

Z góry dziękuję.

Odpowiedz

15

Prawdopodobnie patrzysz na jego wewnętrzną tablicę z debuggerem. To nie ma znaczenia; to tylko szczegół implementacji.

Ważne jest to, co jest widoczne za pośrednictwem publicznego interfejsu API. Innymi słowy, co mówią do ciebie size() (i tak dalej). (A jeśli nie wróci 1 w przykładzie kodu, wtedy coś dziwnego dzieje się!)

+0

Dziękuję bardzo, rozwiązałem moje pytanie :) Przyjmę to jako odpowiedź, gdy tylko system mi pozwoli. – vagaerg

6

ze swojego ekranu jest jasne, że to, co jest dokładnie

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

nie jest sam, ale jego ArrayList zmienna składowa objectData która jest wewnętrznym buforem ArrayList (gdzie faktycznie przechowuje elementy, które do niej dodajesz).

Ten bufor ma większy rozmiar niż rzeczywisty rozmiar ArrayList, ponieważ w przeciwnym razie za każdym razem, gdy dodasz nowy element, cały objectData powinien zostać ponownie przydzielony jako większa tablica, a wszystkie elementy skopiowane, ale jest to z pewnością kosztowne.

Postępuj zgodnie z radą Oli, po prostu zignoruj ​​szczegóły implementacji i zaufaj tylko interfejsowi.

+0

OK, dziękuję bardzo. Nie wiedziałem, że tak było. Więc jeśli moja tablica była większa niż 12 elementów, ten bufor byłby jeszcze większy? Przepraszamy za brak głosów, ale nie mam wystarczającej liczby przedstawicieli. – vagaerg