Dalam pembangunan Java, nampaknya mudah, tetapi terdapat banyak topik dan soalan di Internet, iaitu, apakah perbezaan antara equals() dan operator ==
Pengenalan kandungan hari ini, ia mengambil masa kira-kira 9 minit
Gambar
Untuk lebih memahami perbezaan ini, mari kita lihat contoh:
String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1.equals(str2)); // 输出 trueSystem.out.println(str1 == str2); // 输出 false
Dalam contoh, walaupun kandungan kedua-dua rentetan adalah sama, alamat mereka dalam ingatan adalah berbeza. Oleh itu, menggunakan kaedah .equals() untuk membandingkan kandungannya akan kembali benar, manakala menggunakan operator "==" untuk membandingkan alamat mereka akan mengembalikan false
public boolean equals(Object obj) {return (this == obj);}
Tetapi keadaan sebenar ialah terdapat banyak kelas yang mengatasi kaedah equals() Ini kerana keperluan perbandingan alamat memori adalah ketat dan tidak memenuhi keperluan semua senario kehidupan sebenar Sebagai contoh, kelas String. apabila membandingkan, kebanyakan mereka hanya mahu menilai kandungan sama ada mereka adalah sama, saya tidak benar-benar mahu tahu sama ada alamat memori adalah sama (sama ada ia adalah objek).
Dalam artikel mengenai kajian mendalam tentang kumpulan pemalar rentetan Java, kami telah mengetahui bahawa mesin maya Java memperuntukkan ruang berasingan untuk rentetan - kumpulan pemalar rentetan - untuk mengoptimumkan penggunaan memori dan meningkatkan prestasi.
Adalah disyorkan untuk mencipta objek rentetan menggunakan String s = "Hello" dan bukannya menggunakan kata kunci baharu, kerana baharu memerlukan peruntukan tambahan ruang memori pada timbunan.
1.1. Kaedah equals() kelas String
public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;} //如果是String类型的实例if (anObject instanceof String) { //Object类型的对象强制转换为String类型String aString = (String)anObject;//如果当前字符串对象和传入的字符串对象的编码方式相同if (coder() == aString.coder()) { //如果当前字符串和传入的字符串都是Latin1编码,则调用StringLatin1类的equals方法进行比较;如果其中一个或两个字符串是UTF16编码,则调用StringUTF16类的equals方法进行比较return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}}return false;}
Walaupun Latin1 dan UTF-16 adalah dua kaedah pengekodan, perbezaannya tidak besar. Ambil kaedah equals() daripada UTF-16 untuk melihat
rreee
@HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {int len = value.length >> 1;for (int i = 0; i <div>1.2 Contoh penerangan</div><h3>Contoh 1: </h3><p></p><pre class="brush:php;toolbar:false">public boolean equals(Object anObject) {// 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;}// 如果是String类型的实例if (anObject instanceof String) {////Object类型的对象强制转换为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;}
daripada kaedah equals kelas String ialah sama ada kandungan objek rentetan adalah sama, kerana kesemuanya adalah "Hello", jadi hasilnya adalah benar
Contoh 2:
new String("hello").equals("hello")
== Sama ada alamat objek yang dibandingkan oleh operator adalah sama, = = Sebelah kiri ialah objek yang dicipta dalam timbunan, dan sebelah kanan ialah objek kolam pemalar rentetan Walaupun kandungannya sama, alamatnya tidak sama, jadi keputusannya adalah palsu hasil keluaran?
h dan ello kedua-duanya berada dalam kolam pemalar rentetan, jadi apabila pengkompil menemui operator + Optimumkannya secara automatik kepada hello, jadi hasilnya benar
Contoh 5:
new String("hello") == "hello";
Apakah output result?
new String("hello") Apabila dilaksanakan, objek akan mula-mula dicipta dalam string constant pool , dan kemudian mencipta objek dalam heap apabila melaksanakan kaedah intern(), didapati bahawa objek '; hello' sudah wujud dalam kolam pemalar rentetan, jadi ia mengembalikan rujukan objek secara langsung dalam kolam pemalar rentetan, dan kemudian membandingkannya dengan perbandingan rentetan 'hello' dalam kolam pemalar, jadi hasilnya benar
Analisis mendalam String.intern() telah pun memperkenalkan sebab
new String("hello") == new String("hello");
"hello" == "h"+"ello"
Atas ialah kandungan terperinci Perbezaan dan penggunaan equals() dan == dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!