Saya mencoba untuk mencetak semua elemen dari a List
, tetapi mencetak pointer Object
daripada nilai.
Ini adalah kode pencetakan saya ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Adakah yang bisa membantu saya mengapa tidak mencetak nilai elemen.
List
sebagai? Tunjukkan kepada kami bagaimana Anda mendeklarasikan dan membuat instance itu.for (Object obj : list) {System.out.println(obj);}
.Jawaban:
Berikut adalah beberapa contoh tentang cara mencetak komponen daftar:
sumber
Model
kelas terkait dengan pertanyaan?Berikut ini adalah kompak dan menghindari loop dalam kode contoh Anda (dan memberi Anda koma bagus):
Namun, seperti yang orang lain tunjukkan, jika Anda tidak memiliki metode toString () yang masuk akal diterapkan untuk objek di dalam daftar, Anda akan mendapatkan pointer objek (kode hash, pada kenyataannya) yang Anda amati. Ini benar apakah mereka ada dalam daftar atau tidak.
sumber
list.toString()
.toString
, solusi Anda juga akan mencetak nama kelas dan kode hash.Arrays
metode adalah membantu untuk array, tapi tidak sekarang dibutuhkan untuk subclass dariAbstractCollection
.Sejak Java 8, Daftar mewarisi metode "forEach" default yang dapat Anda gabungkan dengan referensi metode "System.out :: println" seperti ini:
sumber
println
output?toString()
dariAbstractCollection
akan menjadi bersih dan cukup mudah untuk melakukan itu .AbstractList
adalah subclass dariAbstractCollection
, jadi tidak perlu untuk loop dan tidak diperlukan toArray ().Jika Anda menggunakan objek kustom apa pun dalam daftar Anda, katakanlah Student, Anda perlu mengganti
toString()
metodenya (selalu baik untuk mengganti metode ini) untuk mendapatkan hasil yang bermaknaLihat contoh di bawah ini:
keluaran:
sumber
list
:List -> Collection -> Iterable -> Object
. Kelas yang sebenarnya diwarisi dari AbstractCollection adalahArrayList
. Jadi, dalam contoh ini ketikatoString()
dipanggil menemukanArrayList
implementasi yang didefinisikan dalamAbstractCollection
. Perhatikan hierarki warisan untukArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
Pendekatan Java 8 Streaming ...
sumber
Objek dalam daftar harus
toString
diimplementasikan agar mereka dapat mencetak sesuatu yang berarti untuk disaring.Inilah tes cepat untuk melihat perbedaannya:
Dan ketika ini dijalankan, hasil yang dicetak ke layar adalah:
Karena T1 tidak mengesampingkan metode toString, contohnya t1 mencetak sebagai sesuatu yang tidak terlalu berguna. Di sisi lain, T2 menggantikan toString, jadi kami mengontrol apa yang dicetaknya saat digunakan di I / O, dan kami melihat sesuatu yang sedikit lebih baik di layar.
sumber
Pertimbangkan
List<String> stringList
yang dapat dicetak dalam banyak cara menggunakan konstruksi Java 8 :Bagaimana pendekatan ini berbeda satu sama lain?
Pendekatan Pertama (
Iterable.forEach
) - Iterator koleksi umumnya digunakan dan yang dirancang untuk gagal-cepat yang berarti akan dibuangConcurrentModificationException
jika koleksi yang mendasarinya secara struktural dimodifikasi selama iterasi. Sebagaimana disebutkan dalam dokumen untukArrayList
:Jadi itu berarti untuk
ArrayList.forEach
menetapkan nilai diperbolehkan tanpa masalah. Dan dalam kasus pengumpulan konkuren misalnyaConcurrentLinkedQueue
iterator akan lemah-konsisten yang berarti tindakanforEach
yang dilakukan diperbolehkan untuk membuat bahkan perubahan struktural tanpaConcurrentModificationException
kecuali dilemparkan. Tapi di sini modifikasi mungkin atau mungkin tidak terlihat dalam iterasi itu.Pendekatan Kedua (
Stream.forEach
) - Pesanan tidak ditentukan. Meskipun mungkin tidak terjadi untuk aliran berurutan tetapi spesifikasi tidak menjaminnya. Juga tindakan tersebut dituntut untuk tidak mengganggu. Seperti disebutkan dalam dokumen :Pendekatan Ketiga (
Stream.forEachOrdered
) - Tindakan akan dilakukan dalam urutan pertemuan aliran. Jadi, kapan pun pesanan penting digunakanforEachOrdered
tanpa pikir panjang. Sebagaimana disebutkan dalam dokumen :Sementara iterasi pada koleksi yang disinkronkan , pendekatan pertama akan mengambil kunci koleksi sekali dan akan menahannya di semua panggilan untuk metode tindakan, tetapi dalam kasus stream mereka menggunakan kumpulan spliterator, yang tidak mengunci dan bergantung pada aturan non -gangguan. Dalam kasus pengumpulan dukungan, aliran dimodifikasi selama iterasi yang
ConcurrentModificationException
akan dilempar atau hasil yang tidak konsisten dapat terjadi.Pendekatan Keempat (Paralel
Stream.forEach
) - Seperti yang telah disebutkan tidak ada jaminan untuk menghormati urutan pertemuan seperti yang diharapkan dalam kasus aliran paralel. Ada kemungkinan bahwa tindakan dilakukan dalam utas yang berbeda untuk elemen yang berbeda yang tidak akan pernah terjadiforEachOrdered
.Pendekatan Kelima (Paralel
Stream.forEachOrdered
) - ProsesforEachOrdered
akan elemen dalam urutan yang ditentukan oleh sumber terlepas dari fakta apakah aliran berurutan atau paralel. Jadi tidak masuk akal untuk menggunakan ini dengan aliran paralel.sumber
Atau Anda bisa menggunakan utilitas Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
sumber
Gunakan
String.join()
misalnya:sumber
Saya telah menghadapi masalah yang sama. Kode saya:
Cara 1: mencetak daftar dalam for loop
Cara 2: mencetak daftar di forEach, untuk loop
Cara 3: mencetak daftar di java 8
sumber
Tetapi jika elemen-elemennya adalah objek maka seperti yang disebutkan oleh Kshitij Mehta, Anda perlu mengimplementasikan (override) metode "toString" di dalam objek itu - jika belum diimplementasikan - dan membiarkannya mengembalikan sesuatu yang penuh makna dari dalam objek, contoh:
sumber
System.out.println(list);
bekerja untukku.Ini adalah contoh lengkapnya:
Itu akan mencetak
[Hello, World]
.sumber
Untuk daftar array String
sumber
Saya menulis fungsi dump, yang pada dasarnya mencetak anggota publik dari suatu objek jika belum menimpa toString (). Seseorang dapat dengan mudah mengembangkannya untuk memanggil getter. Javadoc:
sumber
Agar loop mencetak konten daftar:
Hasil:
Jika Anda ingin mencetak dalam satu baris (hanya untuk informasi):
Hasil:
sumber
sumber
x
dan bagaimana hubungannya dengan pertanyaan OP?Saya kebetulan sedang mengerjakan ini sekarang ...
sumber
Itu tergantung pada jenis objek yang disimpan di
List
, dan apakah itu memiliki implementasi untuktoString()
metode.System.out.println(list)
harus mencetak semua jenis java objek standar (String
,Long
,Integer
dll). Dalam hal ini, jika kita menggunakan tipe objek kustom, maka kita perluoverride
toString()
metode objek kustom kita.Contoh:
Uji:
sumber
sumber
cobalah untuk mengganti metode toString () seperti yang Anda inginkan bahwa elemen akan printend. jadi metode untuk mencetak bisa seperti ini:
sumber
toString
tersirat.sumber