Jangan gabungkan array dan koleksi. Bahkan, jangan gunakan array kecuali Anda berurusan dengan primitif (atau Anda tahu apa yang Anda lakukan). Array adalah mimpi buruk kegunaan, mereka membuat kode Anda tidak dapat dipelihara.
Sean Patrick Floyd
13
@SeanPatrickFloyd Bisakah Anda menjelaskan mengapa array adalah mimpi buruk kegunaan?
pengguna
3
@ Crucifiedsoul yakin. sebuah array tidak dapat tumbuh, Anda tidak bisa memasukkan apa pun ke dalam array, sebuah array tidak mengesampingkan metode standar seperti sama dengan kode hash atau toString dll.
Sean Patrick Floyd
9
@SeanPatrickFloyd oke - yah saya perlu empat daftar array - Saya berencana untuk mengakses masing-masing dengan indeks - Saya tidak perlu array luar untuk tumbuh atau menyusut - Saya tidak perlu toString atau kode hash, dll - - Bagi saya, array adalah pilihan yang jelas di sini - apa yang akan Anda rekomendasikan sebagai alternatif dalam situasi ini?
BrainSlugs83
4
Oke ini pertanyaan lama tapi saya tetap akan bertanya dan melihat apakah ada yang menjawab. Saya melihat semua orang berbicara tentang mengapa array daftar adalah ide yang buruk, praktik pengkodean yang buruk, dll. Saya melihat ini karena saya sedang belajar untuk melakukan rantai hash, dan definisi rantai hash adalah array daftar! Jadi, bagaimana tepatnya struktur data pemrograman pusat dapat menjadi praktik pengkodean yang mengerikan? Atau apakah ini termasuk dalam kategori IYKWYD yang disebutkan oleh @Sean?
List<List<Individual>> group = new ArrayList<List<Individual>>();mungkin akan lebih baik.
Tom Hawtin - tackline
4
Apa artinya "tidak dapat membuat array tipe generik"? Itu tidak masuk akal bagi saya karena ini bukan obat generik jika Anda memberikan apa yang seharusnya dimiliki, bukan?
Andy
5
Saya terkejut dengan upvotes karena tidak menjawab pertanyaan (yaitu saya ingin melakukan ini, bagaimana saya bisa melakukannya). Kecuali mungkin untuk kalimat pertama.
Florian F
15
mengapa referensi Daftar lebih baik daripada ArrayList?
shifu
3
@shifu a Daftar referensi lebih umum daripada ArrayList; mendeklarasikan sebagai Daftar meringkas API ArrayList yang melampaui API Daftar. Itu bagus karena menyederhanakan referensi ke Daftar yang API mungkin memiliki keseluruhan dari apa yang diperlukan Daftar untuk anyways, tanpa mengacaukan API referensi itu dengan tambahan yang dimiliki ArrayList. Anda hanya boleh mendeklarasikan sebagai ArrayList jika Anda membutuhkan sesuatu yang spesifik dari API untuk tersedia melalui referensi.
cellepo
98
Seperti yang disebutkan orang lain, mungkin lebih baik menggunakan daftar lain untuk menyimpan ArrayList tetapi jika Anda harus menggunakan array:
ArrayList<Individual>[] group =(ArrayList<Individual>[])newArrayList[4];
Sepertinya tidak ada yang menjelaskan dengan baik mengapa dan saya suka cuplikan Anda di atas. mengapa Anda merekomendasikan menggunakan daftar ini?
clankill3r
3
Jika grup array tidak berubah, maka pendekatan ini lebih baik, karena array lebih cepat daripada kelas Daftar <>.
Borzh
33
Terima kasih telah benar-benar menjawab pertanyaan. Tidak ada alasan logis untuk secara otomatis menganggap daftar lebih disukai daripada array tanpa konteks lebih lanjut.
Saus Spesial
3
Ada alasan mengapa ini lebih disukai daripada Jawaban @kelvincer ( ArrayList<String>[] group = new ArrayList[4])? Apa yang dilakukan oleh pemeran yang baik?
cellepo
2
Anda harus menggunakan new ArrayList<?>[N]untuk menghindari menggunakan jenis mentah.
Ini memuaskan memiliki manfaat yang diinginkan bahwa menambahkan ArrayList dari sembarang Objek selain String (yaitu: ArrayList<String>bukan ArrayList<NotString>) untuk grouptidak dikompilasi
cellepo
12
Ini menghasilkan peringatan:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
matematika
24
Anda dapat membuat kelas dengan memperluas ArrayList
Saya benar-benar tidak mengerti, mengapa semua orang menyarankan tipe gen pada array khususnya untuk pertanyaan ini.
Bagaimana jika kebutuhan saya adalah mengindeks daftar nama yang nberbeda.
Dengan mendeklarasikan List<List<Integer>>saya perlu membuat nArrayList<Integer>objek secara manual atau meletakkan for loop untuk membuat ndaftar atau cara lain, dengan cara apa pun akan selalu menjadi tugas saya untuk membuat ndaftar.
Bukankah lebih bagus jika kita mendeklarasikannya melalui casting sebagai List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Saya melihatnya sebagai desain yang bagus di mana orang tidak perlu membuat semua objek pengindeksan (arraylist) sendiri
Adakah yang bisa menjelaskan mengapa ini (arrayform) akan menjadi desain yang buruk dan apa kerugiannya?
AFAICT tampaknya semacam mentalitas kultus kargo yang disebabkan oleh sistem pengetikan yang dibawa Jawa ke meja.
BrainSlugs83
@smsIce: Ini bukan desain yang buruk. Masalahnya adalah, bahwa banyak penulis tidak membaca pertanyaan lengkap atau memahaminya dengan jelas.
testo
16
Anda dapat membuat Array dari ArrayList
List<Integer>[] outer =newList[number];for(int i =0; i < number; i++){
outer[i]=newArrayList<>();}
Ini akan sangat membantu dalam skenario seperti ini. Anda tahu ukuran yang luar. Tetapi ukuran yang dalam bervariasi. Di sini Anda dapat membuat array dengan panjang tetap yang berisi daftar berbagai ukuran Array. Semoga ini bisa membantu Anda.
Di Java 8 dan di atasnya Anda bisa melakukannya dengan cara yang jauh lebih baik.
List<Integer>[] outer =newList[number];Arrays.setAll(outer, element ->newArrayList<>());
Ketika Anda menggunakan ArrayList::new, itu akan memanggil ArrayList(int)contructor dengan indeks saat ini sebagai argumen - ArrayList (1), ArrayList (2), ArrayList (3) dll. Jadi, Anda akan berakhir dengan array berukuran di bawah atau di atas ukuran, tergantung pada penggunaan Anda. Saya akan mencegah menggunakannya dan sebagai gantinya lebih memilih pendekatan kedua di mana Anda memanggil konstruktor sendiri dalam ekspresi lambda Anda.
Genhis
8
Ini berfungsi, array dari ArrayList. Cobalah memahami cara kerjanya.
import java.util.*;publicclassArrayOfArrayList{publicstaticvoid main(String[] args){// Put the length of the array you needArrayList<String>[] group =newArrayList[15];for(int x =0; x < group.length; x++){
group[x]=newArrayList<>();}//Add some thing to first array
group[0].add("Some");
group[0].add("Code");//Add some thing to Secondarray
group[1].add("In here");//Try to output 'emSystem.out.println(group[0]);System.out.println(group[1]);}}
Masalah dengan situasi ini adalah dengan menggunakan daftar array Anda mendapatkan kompleksitas waktu o (n) untuk menambahkan pada posisi tertentu. Jika Anda menggunakan array, Anda membuat lokasi memori dengan mendeklarasikan array Anda karena itu konstan
Untuk mendeklarasikan array ArrayLists secara statis untuk, katakanlah, sprite posisi sebagai Poin:
ArrayList<Point>[] positionList =newArrayList[2];publicMain(---){
positionList[0]=newArrayList<Point>();// Important, or you will get a NullPointerException at runtime
positionList[1]=newArrayList<Point>();}
secara dinamis:
ArrayList<Point>[] positionList;int numberOfLists;publicMain(---){
numberOfLists =2;
positionList =newArrayList[numberOfLists];for(int i =0; i < numberOfLists; i++){
positionList[i]=newArrayList<Point>();}}
Terlepas dari peringatan dan beberapa saran rumit di sini, saya telah menemukan array ArrayLists untuk menjadi solusi elegan untuk mewakili ArrayLists terkait dari jenis yang sama.
Jawaban:
Sesuai Dokumentasi Oracle :
Sebaliknya, Anda bisa melakukan:
Seperti yang disarankan oleh Tom Hawting - tackline, lebih baik melakukannya:
sumber
List<List<Individual>> group = new ArrayList<List<Individual>>();
mungkin akan lebih baik.Seperti yang disebutkan orang lain, mungkin lebih baik menggunakan daftar lain untuk menyimpan ArrayList tetapi jika Anda harus menggunakan array:
sumber
ArrayList<String>[] group = new ArrayList[4]
)? Apa yang dilakukan oleh pemeran yang baik?new ArrayList<?>[N]
untuk menghindari menggunakan jenis mentah.Ini bekerja:
sumber
ArrayList<String>
bukanArrayList<NotString>
) untukgroup
tidak dikompilasiNote: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Anda dapat membuat kelas dengan memperluas ArrayList
dan kemudian buat array
sumber
Saya benar-benar tidak mengerti, mengapa semua orang menyarankan tipe gen pada array khususnya untuk pertanyaan ini.
Bagaimana jika kebutuhan saya adalah mengindeks daftar nama yang
n
berbeda.Dengan mendeklarasikan
List<List<Integer>>
saya perlu membuatn
ArrayList<Integer>
objek secara manual atau meletakkan for loop untuk membuatn
daftar atau cara lain, dengan cara apa pun akan selalu menjadi tugas saya untuk membuatn
daftar.Bukankah lebih bagus jika kita mendeklarasikannya melalui casting sebagai
List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Saya melihatnya sebagai desain yang bagus di mana orang tidak perlu membuat semua objek pengindeksan (arraylist) sendiriAdakah yang bisa menjelaskan mengapa ini (arrayform) akan menjadi desain yang buruk dan apa kerugiannya?
sumber
Anda dapat membuat Array dari ArrayList
Ini akan sangat membantu dalam skenario seperti ini. Anda tahu ukuran yang luar. Tetapi ukuran yang dalam bervariasi. Di sini Anda dapat membuat array dengan panjang tetap yang berisi daftar berbagai ukuran Array. Semoga ini bisa membantu Anda.
Di Java 8 dan di atasnya Anda bisa melakukannya dengan cara yang jauh lebih baik.
Lebih baik lagi menggunakan referensi metode
sumber
ArrayList::new
, itu akan memanggilArrayList(int)
contructor dengan indeks saat ini sebagai argumen - ArrayList (1), ArrayList (2), ArrayList (3) dll. Jadi, Anda akan berakhir dengan array berukuran di bawah atau di atas ukuran, tergantung pada penggunaan Anda. Saya akan mencegah menggunakannya dan sebagai gantinya lebih memilih pendekatan kedua di mana Anda memanggil konstruktor sendiri dalam ekspresi lambda Anda.Ini berfungsi, array dari ArrayList. Cobalah memahami cara kerjanya.
Kredit ke Kelvincer untuk beberapa kode.
sumber
Masalah dengan situasi ini adalah dengan menggunakan daftar array Anda mendapatkan kompleksitas waktu o (n) untuk menambahkan pada posisi tertentu. Jika Anda menggunakan array, Anda membuat lokasi memori dengan mendeklarasikan array Anda karena itu konstan
sumber
Anda tidak dapat membuat larik tipe generik. Buat Daftar ArrayLists:
atau jika Anda BENAR-BENAR membutuhkan array (PERINGATAN: desain yang buruk!):
sumber
Penciptaan dan inisialisasi
Akses tulis
untuk mengakses elemen ArrayList internal:
Baca akses
untuk membaca elemen array i sebagai ArrayList gunakan tipe casting:
untuk elemen array i: untuk membaca elemen ArrayList di indeks j
sumber
List [] listArr = ArrayList baru [4];
Di atas baris memberikan peringatan, tetapi berfungsi (yaitu menciptakan Array of ArrayList)
sumber
Untuk mendeklarasikan array ArrayLists secara statis untuk, katakanlah, sprite posisi sebagai Poin:
secara dinamis:
Terlepas dari peringatan dan beberapa saran rumit di sini, saya telah menemukan array ArrayLists untuk menjadi solusi elegan untuk mewakili ArrayLists terkait dari jenis yang sama.
sumber
sumber
Anda bisa buat seperti ini
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Anda harus membuat larik tipe non generik dan kemudian melemparkannya menjadi generik.
sumber
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Berhasil.sumber
Saya menemukan ini lebih mudah digunakan ...
sumber
Kamu bisa melakukan ini :
// Buat Array jenis ArrayList
// Untuk setiap elemen dalam array, buat ArrayList
sumber
sumber
Anda dapat membuat Daftar [] dan menginisialisasi mereka dengan for loop. kompilasi tanpa kesalahan:
ia bekerja dengan arrayList [] l juga.
sumber
l.length
tidak terdefinisi dalam for-loop. Ini mungkin kesalahan runtime.