Apakah ada cara untuk membuat daftar int primitif atau primitif apapun di java seperti berikut?
List<int> myList = new ArrayList<int>();
Sepertinya saya bisa melakukannya List myList = new ArrayList();
dan tambahkan "int" ke dalam daftar ini. Tapi ini berarti saya bisa menambahkan apapun ke dalam daftar ini.
Apakah satu-satunya pilihan saya, membuat array int dan mengubahnya menjadi daftar atau membuat daftar objek Integer?
java
list
generics
collections
Susie
sumber
sumber
Jawaban:
Di Java, tipe variabel apa pun adalah tipe primitif atau tipe referensi. Argumen tipe generik harus tipe referensi. Karena primitif tidak diperpanjang,
Object
mereka tidak dapat digunakan sebagai argumen tipe umum untuk tipe parametrized.Sebagai gantinya gunakan
Integer
kelas yang merupakan pembungkus untukint
:List<Integer> list = new ArrayList<Integer>();
Jika Anda menggunakan Java 7, Anda dapat menyederhanakan deklarasi ini menggunakan operator berlian:
List<Integer> list = new ArrayList<>();
Dengan autoboxing di Java, tipe primitif
int
akan menjadiInteger
ketika diperlukan.Jadi berikut ini valid:
int myInt = 1; List<Integer> list = new ArrayList<Integer>(); list.add(myInt); System.out.println(list.get(0)); //prints 1
sumber
Tidak ada koleksi apa pun yang bisa berisi tipe primitif saat Java Collection Framework digunakan.
Namun, ada koleksi java lain yang mendukung tipe primitif, seperti: Trove , Colt , Fastutil , Guava
Contoh bagaimana arraylist dengan int akan menjadi ketika Trove Library digunakan adalah sebagai berikut:
TIntArrayList list= new TIntArrayList();
Performa daftar ini, jika dibandingkan dengan ArrayList of Integers from Java Collections jauh lebih baik karena autoboxing / unboxing ke Integer Wrapper Class tidak diperlukan.
sumber
Tidak, kamu tidak bisa. Anda hanya dapat membuat Daftar jenis referensi, seperti
Integer
,String
, atau jenis kustom Anda.Saat Anda menambahkan
int
ke daftar ini, secara otomatis dimasukkan ke dalam kotak keInteger
jenis pembungkus. Tapi itu ide yang buruk untuk menggunakan daftar tipe mentah , atau untuk tipe generik dalam hal ini, dalam kode yang lebih baru.Tentu saja, itu adalah kerugian menggunakan tipe mentah. Anda dapat memiliki Kucing , Anjing , Harimau , Dinosaurus , semuanya dalam satu wadah.
Dalam hal ini juga, Anda akan mendapatkan file
List<Integer>
. Tidak ada cara Anda dapat membuatList<int>
atau primitif.Anda tidak perlu diganggu. Bahkan di dalam
List<Integer>
Anda dapat menambahkanint
tipe primitif. Ini akan secara otomatis dikotakkan, seperti pada contoh di bawah ini:List<Integer> list = new ArrayList<Integer>(); list.add(5);
sumber
Coba gunakan ArrayIntList dari framework apache. Ia bekerja persis seperti daftar larik, kecuali ia dapat menampung int primitif.
Detail lebih lanjut di sini -
https://commons.apache.org/dormant/commons-primitives/apidocs/org/apache/commons/collections/primitives/ArrayIntList.html
sumber
Ini tidak mungkin. Spesifikasi java melarang penggunaan primitif dalam obat generik. Namun, Anda dapat membuat
ArrayList<Integer>
dan memanggiladd(i)
jikai
itu int berkat tinju.sumber
Anda dapat menggunakan koleksi primitif yang tersedia di Eclipse Collections . Eclipse Koleksi memiliki
List
,Set
,Bag
danMap
untuk semua primitif. Unsur-unsur dalam koleksi primitif dipertahankan sebagai primitif dan tidak ada tinju yang terjadi.Anda dapat menginisialisasi IntList seperti ini:
Anda dapat mengonversi dari a
List<Integer>
menjadiIntList
seperti ini:List<Integer> integers = new ArrayList<>(); MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);
Catatan: Saya adalah kontributor Koleksi Eclipse.
sumber
Koleksi menggunakan obat generik yang mendukung tipe referensi atau wilcard. Namun Anda bisa menggunakan
Integer
pembungkusList<Integer> list = new ArrayList<>();
sumber
Saat Anda menggunakan Java untuk pengembangan Android, sebaiknya gunakan
SparseIntArray
untuk mencegah autoboxing antaraint
danInteger
.Anda dapat menemukan informasi lebih lanjut
SparseIntArray
di dokumentasi Pengembang Android dan penjelasan yang baik untuk autoboxing di Android masukkan deskripsi tautan di sinisumber
SparseIntArray
sering kali merupakan pilihan yang lebih baik, tetapi ada pengorbanan yang harus diperhatikan. "Implementasinya tidak dimaksudkan agar sesuai untuk struktur data yang mungkin berisi sejumlah besar item. Ini umumnya lebih lambat daripada HashMap tradisional ..."Kelalaian besar-besaran dari pustaka inti Java ini tampaknya muncul di hampir semua proyek yang pernah saya kerjakan. Dan senyaman mungkin pustaka Trove, saya tidak dapat mengurai persyaratan yang tepat untuk memenuhi LPGL untuk aplikasi Android yang secara statis menautkan pustaka LGPL (pembukaan mengatakan ok, badan tampaknya tidak mengatakan hal yang sama). Dan sangat tidak nyaman untuk melakukan rip-and-stripping sumber Apache untuk mendapatkan kelas ini. Pasti ada cara yang lebih baik.
sumber
Koleksi Java harus merupakan koleksi Objek saja.
List<Integer> integerList = new ArrayList<Integer>();
Integer adalah kelas pembungkus dari tipe data primitif int.
lebih dari kelas pembungkus JAVA di sini !
Anda bisa langsung menyimpan dan mendapatkan int ke / dari integerList sebagai,
integerList.add(intValue);
int intValue = integerList.get(i)
sumber