Buat Daftar int primitif?

97

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?

Susie
sumber
Jika kinerja menjadi perhatian Anda, trove akan membantu.
assylias
Dimungkinkan untuk membuat daftar menggunakan larik dasar, tetapi Anda harus mengetahui ukuran larik untuk memulai, dan Anda akan kehilangan banyak fungsionalitas lain yang disertakan dengan objek Koleksi. Tapi Anda bisa melakukan sesuatu seperti: int [] array = new int [10];
Taylor

Jawaban:

144

Di Java, tipe variabel apa pun adalah tipe primitif atau tipe referensi. Argumen tipe generik harus tipe referensi. Karena primitif tidak diperpanjang, Objectmereka tidak dapat digunakan sebagai argumen tipe umum untuk tipe parametrized.

Sebagai gantinya gunakan Integerkelas yang merupakan pembungkus untuk int:

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 intakan menjadi Integerketika diperlukan.

Autoboxing adalah konversi otomatis yang dibuat oleh compiler Java antara tipe primitif dan kelas pembungkus objeknya yang sesuai.

Jadi berikut ini valid:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
sumber
1
Jadi metode JTable setSelectedIndices tidak masuk akal: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

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.

Mike B
sumber
1
Saya tidak dapat menemukan implementasi koleksi primitif di Guava. Bisakah Anda memberikan tautan?
nimcap
9

Apakah ada cara untuk membuat daftar int primitif atau primitif apapun di java

Tidak, kamu tidak bisa. Anda hanya dapat membuat Daftar jenis referensi, seperti Integer, String, atau jenis kustom Anda.

Sepertinya saya bisa melakukan List myList = new ArrayList();dan menambahkan "int" ke dalam daftar ini.

Saat Anda menambahkan intke daftar ini, secara otomatis dimasukkan ke dalam kotak ke Integerjenis pembungkus. Tapi itu ide yang buruk untuk menggunakan daftar tipe mentah , atau untuk tipe generik dalam hal ini, dalam kode yang lebih baru.

Saya dapat menambahkan apapun ke dalam daftar ini.

Tentu saja, itu adalah kerugian menggunakan tipe mentah. Anda dapat memiliki Kucing , Anjing , Harimau , Dinosaurus , semuanya dalam satu wadah.

Apakah satu-satunya pilihan saya, membuat array int dan mengubahnya menjadi daftar

Dalam hal ini juga, Anda akan mendapatkan file List<Integer>. Tidak ada cara Anda dapat membuat List<int>atau primitif.

Anda tidak perlu diganggu. Bahkan di dalam List<Integer>Anda dapat menambahkan inttipe primitif. Ini akan secara otomatis dikotakkan, seperti pada contoh di bawah ini:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
sumber
Diskusi yang bagus tentang tipe mentah.
Kevin Bowersox
Sebenarnya agar lebih jelas, Anda bisa membuat list dengan tipe primitif hanya dengan menggunakan basic array. int [] larik = int baru [10];
Taylor
1
@Taylor Tapi itu tidak akan menjadi daftar yang meningkat secara dinamis. Itu array. Dan saya berasumsi OP pasti sudah tahu tentang itu.
Rohit Jain
5

Ini tidak mungkin. Spesifikasi java melarang penggunaan primitif dalam obat generik. Namun, Anda dapat membuat ArrayList<Integer>dan memanggil add(i)jika iitu int berkat tinju.

nanofarad.dll
sumber
4

Anda dapat menggunakan koleksi primitif yang tersedia di Eclipse Collections . Eclipse Koleksi memiliki List, Set, Bagdan Mapuntuk semua primitif. Unsur-unsur dalam koleksi primitif dipertahankan sebagai primitif dan tidak ada tinju yang terjadi.

Anda dapat menginisialisasi IntList seperti ini:

MutableIntList ints = IntLists.mutable.empty();

Anda dapat mengonversi dari a List<Integer>menjadi IntListseperti ini:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Catatan: Saya adalah kontributor Koleksi Eclipse.

Nikhil Nanivadekar
sumber
3

Koleksi menggunakan obat generik yang mendukung tipe referensi atau wilcard. Namun Anda bisa menggunakan Integerpembungkus

List<Integer> list = new ArrayList<>();
Reimeus
sumber
0

Saat Anda menggunakan Java untuk pengembangan Android, sebaiknya gunakan SparseIntArrayuntuk mencegah autoboxing antara intdan Integer.

Anda dapat menemukan informasi lebih lanjut SparseIntArraydi dokumentasi Pengembang Android dan penjelasan yang baik untuk autoboxing di Android masukkan deskripsi tautan di sini

Stefan Medack
sumber
Itu pernyataan yang kuat. Tentu SparseIntArraysering 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 ..."
Andy Thomas
Ya itu benar. Mereka menutupi pengorbanan ini dengan cukup baik dalam video yang saya tautkan. Tetapi OP meminta kemungkinan khusus itu dan saya hanya ingin menambahkan bahwa itu sebenarnya mungkin dengan Android dan juga direkomendasikan untuk sebagian besar kasus penggunaan. Terima kasih telah menambahkan informasi itu!
Stefan Medack
0

Apakah ada cara untuk mengubah array Integer [] menjadi array int []?

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.

Robin Davies
sumber
-4

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)

Selvaraj
sumber
1
Baris pertama tidak dapat dikompilasi dan dua baris kode terakhir ada di mana-mana. Tolong jangan melakukan ini.
The_Martian