Rumah  >  Artikel  >  Peranti teknologi  >  Perbezaan dan penggunaan equals() dan == dalam Java

Perbezaan dan penggunaan equals() dan == dalam Java

WBOY
WBOYke hadapan
2024-03-07 15:28:11302semak imbas

Dalam pembangunan Java, nampaknya mudah, tetapi terdapat banyak topik dan soalan di Internet, iaitu, apakah perbezaan antara equals() dan operator ==

  • ==: Operator digunakan untuk membandingkan dua Sama ada alamat objek adalah sama
  • sama(): kaedah digunakan untuk membandingkan sama ada kandungan dua objek adalah sama

Pengenalan kandungan hari ini, ia mengambil masa kira-kira 9 minit

Perbezaan dan penggunaan equals() dan == dalam JavaGambar

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

1 asas Java, Anda harus tahu bahawa semua kelas dalam Java mewarisi kelas Objek secara lalai Terdapat kaedah .equals() dalam kelas Object

public boolean equals(Object obj) {return (this == obj);}
Daripada kod, anda boleh mendapati bahawa kaedah .equals(). menggunakan operator == untuk perbandingan secara lalai Jika subkelas tidak diganti dengan kaedah equals(), kemudian gunakan operator == dan kaedah equals(), hasilnya adalah sama - digunakan untuk membandingkan sama ada alamat memori dua. objek adalah sama.

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

Kaedah equals() kelas String Jdk11

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;}
Nota khas: Latin1 (juga dikenali sebagai ISO 8859-16) (UTFnicode) dan UTFnicode format penukaran 16-bit ) ialah dua kaedah pengekodan aksara yang berbeza

Walaupun Latin1 dan UTF-16 adalah dua kaedah pengekodan, perbezaannya tidak besar. Ambil kaedah equals() daripada UTF-16 untuk melihat

rreee

Nota: Java8 Kod sumber kaedah equals() Java11 adalah berbeza daripada kaedah equals() JDK8

@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;}
Apakah hasil

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")
Apakah hasil keluarannya?

== 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

2 Perbandingan kaedah lain

Selain kaedah .equals() dan operator "==" , terdapat beberapa kaedah perbandingan lain yang boleh digunakan:

1. Kaedah Objects.equals(): Kaedah statik ini boleh digunakan untuk membandingkan sama ada dua objek adalah sama, dan tidak perlu menentukan sama ada objek itu kosong sebelum memanggil.

new String("hello") == new String("hello");

2. Kaedah .contentEquals() kelas String: Kaedah ini boleh digunakan untuk membandingkan sama ada rentetan adalah sama dengan mana-mana jujukan aksara (seperti StringBuffer, StringBuilder, String, CharSequence).

"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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam