== membandingkan sama ada pembolehubah yang ditunjuk kepada objek adalah konsisten Sebab mengapa s dan s2 adalah sama adalah kerana jvm mengoptimumkan dan dua pembolehubah menghala ke satu objek. equal membandingkan sama ada rentetan yang disimpan dalam objek adalah sama.
== menguji sama ada dua rujukan menghala ke objek yang sama. Jika anda ingin menguji sama ada dua objek berbeza adalah sama, anda mesti menggunakan kaedah equals().
Jika anda berminat untuk mengetahui lebih lanjut, anda boleh membaca artikel yang saya tulis. Panduan Literasi Pantas Java
Saya rasa soalan anda sangat bermasalah Bagaimana anda mendapat kesimpulan yang diterangkan dalam teks daripada kod yang anda siarkan? Saya akan membuat tekaan kasar tentang niat anda dan cuba menjawabnya dengan berat hati. Di java, kaedah == dan sama adalah berbeza, penerangan ringkas adalah seperti berikut:
==
== digunakan untuk menentukan sama ada dua rujukan menghala ke objek yang sama, seperti Objek a = new Object(); Objek b = a; a == b; => ; benar
sama
Kaedah sama digunakan untuk menentukan sama ada dua objek adalah sama. Kaedah ini telah ditakrifkan dalam Objek kelas peringkat atas Pelaksanaan kaedah ini dalam Object menggunakan == untuk membandingkan rujukan untuk kesaksamaan. Jika mana-mana subkelas ingin menggunakan kaedah yang sama, yang terbaik adalah untuk mengatasi kaedah yang sama bagi Objek dan menyediakan logik kesamaan sendiri. Tentukan kelas Orang seperti berikut.
public class Person {
private String name;
private int age;
// ...
@Override
public boolean equal(Object o) {
if(o instanceof Person) {
return o.getName().equal(name) && o.getAge() == age;
} else {
return false;
}
}
}
s dan s2 kedua-duanya adalah rujukan langsung kepada pemalar "12". Pengkompil akan mengoptimumkan kod dan hanya mencipta objek Rentetan "12", yang dirujuk oleh dua pembolehubah, jadi s == s2. Tetapi jika "12" anda yang lain dibuat dengan cara lain, seperti new String("12"), atau "1234".substring(0, 2), anda akan mendapati bahawa == tidak berfungsi dan equals membandingkan kandungannya. Melihat pada kod asal equals anda akan mendapati bahawa ia juga menggunakan == terlebih dahulu untuk membandingkan
yang dirujuk
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Pertama sekali, kita mesti mempertimbangkan fungsi sama dan ==: == adalah bersamaan dengan membandingkan rujukan dua objek, manakala kaedah sama ditakrifkan dalam kelas Objek dan telah ditulis semula oleh String kelas. Kod sumber boleh dilihat Dalam analisis di atas, == pertama kali digunakan untuk membandingkan rujukan, dan kemudian kandungannya dibandingkan. Apabila kita membandingkan dua rentetan, kita kebanyakannya ingin membandingkan kandungan, jadi kita menggunakan kaedah sama. Jika anda menggunakan ==, IDE sebenarnya akan memberikan amaran.
Jadi mengapa kaedah == dan sama anda mempunyai kesan yang sama Ia bergantung pada perbezaan antara menggunakan "=" untuk mencipta objek rentetan dan menggunakan baharu untuk mencipta rentetan. Saya tidak tahu sama ada anda pernah memahami kumpulan rentetan Pemahaman saya tidak mendalam. Anda boleh melihatnya sendiri jika perlu. Kali pertama anda menggunakan "=" untuk mencipta objek rentetan, ia akan menyemak sama ada terdapat "12" dalam kolam rentetan Jika tidak, tambahkan satu pada kolam dan kembalikan rujukan kepada s; , didapati terdapat satu dalam kolam, maka rujukan ini diberikan terus kepada s2, jadi rujukan s dan s2 adalah sama, menyebabkan perbandingan == adalah benar. Anda boleh menggunakan baharu untuk mencipta rentetan dan melihat kesannya:
Apabila menggunakan kata kunci baharu untuk mencipta objek rentetan, objek baharu akan dibuat setiap kali dan rujukan akan diberikan kepada pembolehubah.
Kandungan s1 dan s2 anda adalah sama Kaedah tugasan anda adalah seperti ini Pertama, s1 akan meletakkan rentetan "..." ke dalam kumpulan tetap mesin maya JVM 🎜>Apabila menetapkan s2 untuk kali kedua, ia akan terlebih dahulu menentukan sama ada kolam malar mengandungi rentetan ini, dan jika ya, tuding kepadanya. Jadi walaupun anda menggunakan == ia akan menjadi sama. Jika anda menggunakan rentetan baharu(123) dalam s2, maka alamat rujukan adalah berbeza dan ia tidak sama. Kod pada telefon bimbit bukanlah mudah.
Keputusan:
== membandingkan sama ada pembolehubah yang ditunjuk kepada objek adalah konsisten Sebab mengapa s dan s2 adalah sama adalah kerana jvm mengoptimumkan dan dua pembolehubah menghala ke satu objek.
equal membandingkan sama ada rentetan yang disimpan dalam objek adalah sama.
Sesetengah soalan sebenarnya mempunyai jawapan terbaik dalam kod sumber
Operator
== menguji sama ada dua rujukan menghala ke objek yang sama. Jika anda ingin menguji sama ada dua objek berbeza adalah sama, anda mesti menggunakan kaedah equals().
Jika anda berminat untuk mengetahui lebih lanjut, anda boleh membaca artikel yang saya tulis. Panduan Literasi Pantas Java
Saya rasa soalan anda sangat bermasalah Bagaimana anda mendapat kesimpulan yang diterangkan dalam teks daripada kod yang anda siarkan?
Saya akan membuat tekaan kasar tentang niat anda dan cuba menjawabnya dengan berat hati.
Di java, kaedah == dan sama adalah berbeza, penerangan ringkas adalah seperti berikut:
==
== digunakan untuk menentukan sama ada dua rujukan menghala ke objek yang sama, seperti
Objek a = new Object();
Objek b = a;
a == b; => ; benar
sama
Kaedah sama digunakan untuk menentukan sama ada dua objek adalah sama. Kaedah ini telah ditakrifkan dalam Objek kelas peringkat atas Pelaksanaan kaedah ini dalam Object menggunakan == untuk membandingkan rujukan untuk kesaksamaan. Jika mana-mana subkelas ingin menggunakan kaedah yang sama, yang terbaik adalah untuk mengatasi kaedah yang sama bagi Objek dan menyediakan logik kesamaan sendiri. Tentukan kelas Orang seperti berikut.
yang dirujuks
dans2
kedua-duanya adalah rujukan langsung kepada pemalar "12". Pengkompil akan mengoptimumkan kod dan hanya mencipta objek Rentetan "12", yang dirujuk oleh dua pembolehubah, jadi s == s2. Tetapi jika "12" anda yang lain dibuat dengan cara lain, sepertinew String("12")
, atau"1234".substring(0, 2)
, anda akan mendapati bahawa==
tidak berfungsi danequals
membandingkan kandungannya. Melihat pada kod asalequals
anda akan mendapati bahawa ia juga menggunakan==
terlebih dahulu untuk membandingkanIa akan berbeza apabila baru keluar
Pertama sekali, kita mesti mempertimbangkan fungsi sama dan ==:
== adalah bersamaan dengan membandingkan rujukan dua objek, manakala kaedah sama ditakrifkan dalam kelas Objek dan telah ditulis semula oleh String kelas. Kod sumber boleh dilihat Dalam analisis di atas, == pertama kali digunakan untuk membandingkan rujukan, dan kemudian kandungannya dibandingkan.
Apabila kita membandingkan dua rentetan, kita kebanyakannya ingin membandingkan kandungan, jadi kita menggunakan kaedah sama. Jika anda menggunakan ==, IDE sebenarnya akan memberikan amaran.
Jadi mengapa kaedah == dan sama anda mempunyai kesan yang sama Ia bergantung pada perbezaan antara menggunakan "=" untuk mencipta objek rentetan dan menggunakan baharu untuk mencipta rentetan.
Saya tidak tahu sama ada anda pernah memahami kumpulan rentetan Pemahaman saya tidak mendalam. Anda boleh melihatnya sendiri jika perlu.
Kali pertama anda menggunakan "=" untuk mencipta objek rentetan, ia akan menyemak sama ada terdapat "12" dalam kolam rentetan Jika tidak, tambahkan satu pada kolam dan kembalikan rujukan kepada s; , didapati terdapat satu dalam kolam, maka rujukan ini diberikan terus kepada s2, jadi rujukan s dan s2 adalah sama, menyebabkan perbandingan == adalah benar.
Anda boleh menggunakan baharu untuk mencipta rentetan dan melihat kesannya:
Apabila menggunakan kata kunci baharu untuk mencipta objek rentetan, objek baharu akan dibuat setiap kali dan rujukan akan diberikan kepada pembolehubah.
Semua berkata baik, saya cadangkan anda mencari kolam pemalar rentetan, ia akan memberi anda pemahaman yang mendalam
Kandungan s1 dan s2 anda adalah sama
Kaedah tugasan anda adalah seperti ini
Pertama, s1 akan meletakkan rentetan "..." ke dalam kumpulan tetap mesin maya JVM 🎜>Apabila menetapkan s2 untuk kali kedua, ia akan terlebih dahulu menentukan sama ada kolam malar mengandungi rentetan ini, dan jika ya, tuding kepadanya.
Jadi walaupun anda menggunakan == ia akan menjadi sama.
Jika anda menggunakan rentetan baharu(123) dalam s2, maka alamat rujukan adalah berbeza dan ia tidak sama.
Kod pada telefon bimbit bukanlah mudah.