Katakanlah saya membuat satu objek dan menambahkannya ke ArrayList
. Jika saya kemudian membuat objek lain dengan input konstruktor yang persis sama, akankah contains()
metode mengevaluasi dua objek menjadi sama? Asumsikan konstruktor tidak melakukan sesuatu yang lucu dengan input, dan variabel yang disimpan di kedua objek identik.
ArrayList<Thing> basket = new ArrayList<Thing>();
Thing thing = new Thing(100);
basket.add(thing);
Thing another = new Thing(100);
basket.contains(another); // true or false?
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
Apakah ini cara yang class
harus diterapkan untuk mendapatkan contains()
kembali true
?
java
object
arraylist
evaluation
Mantas Vidutis
sumber
sumber
Object
alih - alih aThing
. Jika tidak, metode equals Anda tidak akan digunakan. :)Collections
melakukan hal-hal mereka dengan cara yang dioptimalkan, yang berarti bahwacontains()
pertama - tama memeriksahashCode
s dari dua objek, dan hanya kemudian memanggilequals()
. JikahashCode
s berbeda (yang selalu merupakan kasus untuk dua contoh berbedaThing
),equals()
metode tidak akan dipanggil. Sebagai aturan praktis, ketika Anda menimpaequals()
, Anda tidak boleh lupa untuk menimpanyahashCode()
juga.Saya pikir implementasi yang tepat seharusnya
sumber
if
pernyataan itu tidak perlu.instanceof
cukup.object != null
kondisi tidak diperlukan, karenaobject instanceof Thing
pemeriksaan untuk objek menjadi tidak nol juga.ArrayList menggunakan metode equals yang diterapkan di kelas (kelas case Anda) untuk melakukan perbandingan equals.
sumber
Secara umum Anda juga harus mengganti
hashCode()
setiap kali Anda menimpaequals()
, meskipun hanya untuk meningkatkan kinerja.HashCode()
memutuskan 'ember' objek mana yang akan disortir saat melakukan perbandingan, sehingga setiap dua objek yangequal()
bernilai true harus mengembalikan yang samahashCode
value()
. Saya tidak dapat mengingat perilaku defaulthashCode()
(jika mengembalikan 0 maka kode Anda harus bekerja tetapi lambat, tetapi jika mengembalikan alamat maka kode Anda akan gagal). Saya ingat beberapa kali ketika kode saya gagal karena saya lupa menimpahashCode()
. :)sumber
Ia menggunakan metode equals pada objek. Jadi kecuali Hal yang sama dengan dan menggunakan variabel yang disimpan dalam objek untuk perbandingan, itu tidak akan mengembalikan true pada
contains()
metode.sumber
Anda harus menulis:
Sekarang berhasil;)
sumber
Hanya ingin mencatat bahwa implementasi berikut ini salah ketika
value
bukan tipe primitif:Dalam hal ini saya mengusulkan yang berikut:
sumber
Poster lain telah menjawab pertanyaan tentang bagaimana memuat () berfungsi.
Aspek yang sama pentingnya dari pertanyaan Anda adalah bagaimana menerapkan dengan benar equals (). Dan jawaban untuk ini benar-benar tergantung pada apa yang merupakan persamaan objek untuk kelas khusus ini. Dalam contoh yang Anda berikan, jika Anda memiliki dua objek berbeda yang keduanya memiliki x = 5, apakah keduanya sama? Itu benar-benar tergantung pada apa yang Anda coba lakukan.
Jika Anda hanya tertarik pada persamaan objek, maka implementasi default .equals () (yang disediakan oleh Object) hanya menggunakan identitas (yaitu ini == lainnya). Jika itu yang Anda inginkan, maka jangan implementasikan equals () di kelas Anda (biarkan diwarisi dari Object). Kode yang Anda tulis, walaupun agak benar jika Anda mencari identitas, tidak akan pernah muncul di kelas nyata b / c itu tidak memberikan manfaat dibandingkan menggunakan implementasi Object.equals () default.
Jika Anda baru memulai dengan hal ini, saya sangat merekomendasikan buku Java Efektif oleh Joshua Bloch. Ini adalah bacaan yang bagus, dan mencakup hal semacam ini (ditambah cara menerapkan dengan benar equals () ketika Anda mencoba melakukan lebih dari perbandingan berbasis identitas)
sumber
Pintasan dari JavaDoc :
boolean berisi (Objek o)
Mengembalikan nilai true jika daftar ini mengandung elemen yang ditentukan. Lebih formal, mengembalikan true jika dan hanya jika daftar ini mengandung setidaknya satu elemen e sedemikian rupa sehingga (o == null? E == null: o.equals (e))
sumber