Czy istnieje sposób na utworzenie listy prymitywów int lub dowolnych prymitywów w Javie, takich jak śledzenie?
List<int> myList = new ArrayList<int>();
Wygląda na to, że mogę to zrobić List myList = new ArrayList();
i dodaj „int” do tej listy. Ale wtedy oznaczałoby to, że mogę dodać cokolwiek do tej listy.
Czy moja jedyna opcja polega na utworzeniu tablicy int i przekształceniu jej w listę lub utworzenie listy obiektów typu Integer?
java
list
generics
collections
Susie
źródło
źródło
Odpowiedzi:
W języku Java typem dowolnej zmiennej jest typ pierwotny lub typ referencyjny. Argumenty typu ogólnego muszą być typami odwołań. Ponieważ prymitywy nie rozszerzają się,
Object
nie mogą być używane jako argumenty typu ogólnego dla sparametryzowanego typu.Zamiast tego użyj
Integer
klasy, która jest opakowaniem dlaint
:List<Integer> list = new ArrayList<Integer>();
Jeśli używasz Java 7, możesz uprościć tę deklarację za pomocą operatora diamentu:
List<Integer> list = new ArrayList<>();
Dzięki autoboxingowi w Javie typ prymitywny
int
stanie się wInteger
razie potrzeby.Tak więc obowiązuje:
int myInt = 1; List<Integer> list = new ArrayList<Integer>(); list.add(myInt); System.out.println(list.get(0)); //prints 1
źródło
Nie, nie ma żadnej kolekcji, która może zawierać typy pierwotne, gdy jest używana platforma Java Collection Framework.
Istnieją jednak inne kolekcje Java, które obsługują typy prymitywne, takie jak: Trove , Colt , Fastutil , Guava
Przykład tego, jak arraylista z ints wyglądałby, gdyby została użyta biblioteka Trove:
TIntArrayList list= new TIntArrayList();
Wydajność tej listy, w porównaniu z ArrayList of Integers z kolekcji Java, jest znacznie lepsza, ponieważ nie jest potrzebne automatyczne dodawanie / rozpakowywanie do odpowiedniej klasy opakowania typu Integer.
źródło
Nie, nie możesz. Można jedynie tworzyć listy typów referencyjnych, jak
Integer
,String
lub twój typ niestandardowy.Po dodaniu
int
do tej listy jest ona automatycznie umieszczana w ramce doInteger
typu opakowania. Ale złym pomysłem jest używanie list typów surowych lub dowolnego typu ogólnego w nowszym kodzie.Oczywiście jest to wada używania typu surowego. Możesz mieć kota , psa , tygrysa , dinozaura , wszystko w jednym pojemniku.
W takim przypadku również otrzymasz
List<Integer>
tylko. Nie ma możliwości tworzeniaList<int>
ani żadnych prymitywów.I tak nie powinieneś się tym przejmować. Nawet w
List<Integer>
tobie można dodaćint
typy pierwotne. Zostanie automatycznie zapakowany, jak w poniższym przykładzie:List<Integer> list = new ArrayList<Integer>(); list.add(5);
źródło
Spróbuj użyć ArrayIntList z frameworka Apache. Działa dokładnie tak, jak arraylista, z wyjątkiem tego, że może przechowywać pierwotne int.
Więcej szczegółów tutaj -
https://commons.apache.org/dormant/commons-primitives/apidocs/org/apache/commons/collections/primitives/ArrayIntList.html
źródło
To jest niemożliwe. Specyfikacja java zabrania używania prymitywów w rodzajach. Jednak dzięki boksowi możesz tworzyć
ArrayList<Integer>
i dzwonić,add(i)
jeślii
jest intem.źródło
Możesz użyć kolekcji pierwotnych dostępnych w Kolekcje Eclipse . Eclipse posiada kolekcje
List
,Set
,Bag
iMap
dla wszystkich prymitywów. Elementy w kolekcjach prymitywnych są utrzymywane jako prymitywy i nie ma miejsca na boksowanie.Możesz zainicjować IntList w następujący sposób:
Możesz przekonwertować z a
List<Integer>
naIntList
taki:List<Integer> integers = new ArrayList<>(); MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);
Uwaga: współtworzę kolekcje Eclipse.
źródło
Kolekcje używają typów ogólnych, które obsługują typy odwołań lub karty wilcards. Możesz jednak użyć
Integer
opakowaniaList<Integer> list = new ArrayList<>();
źródło
W przypadku programowania w języku Java dla systemu Android zaleca się użycie,
SparseIntArray
aby zapobiec automatycznemu blokowaniu międzyint
aInteger
.Więcej informacji można znaleźć
SparseIntArray
w dokumentacji dla programistów aplikacji na Androida oraz dobre wyjaśnienie dotyczące automatycznego blokowania w systemie Android.Wprowadź opis linku tutajźródło
SparseIntArray
jest to często lepsza opcja, ale istnieją kompromisy, o których należy pamiętać. „Implementacja nie ma być odpowiednia dla struktur danych, które mogą zawierać dużą liczbę elementów. Generalnie jest wolniejsza niż tradycyjna HashMap…”To rażące pominięcie podstawowych bibliotek Java wydaje się pojawiać w prawie każdym projekcie, nad którym kiedykolwiek pracowałem. I chociaż biblioteka Trove może być wygodna, nie jestem w stanie przeanalizować dokładnych wymagań, aby spełnić LPGL dla aplikacji na Androida, która statycznie łączy bibliotekę LGPL (preambuła mówi: OK, ciało nie wydaje się mówić tego samego). Po prostu zgrywanie i usuwanie źródeł Apache w celu uzyskania tych klas jest po prostu niewygodne. Musi być lepszy sposób.
źródło
Kolekcja Java powinna składać się wyłącznie z kolekcji Object.
List<Integer> integerList = new ArrayList<Integer>();
Integer to klasa opakowująca pierwotnego typu danych int.
więcej z zajęć związanych z opakowaniami JAVA tutaj !
Możesz bezpośrednio zapisać i pobrać int do / z integerList jako,
integerList.add(intValue);
int intValue = integerList.get(i)
źródło