基於Java字符串 "==" 與 "equals" 的深刻懂得。本站提示廣大學習愛好者:(基於Java字符串 "==" 與 "equals" 的深刻懂得)文章只能為提供參考,不一定能成為您想要的結果。以下是基於Java字符串 "==" 與 "equals" 的深刻懂得正文
固然關於Java字符串“==”和“equals”的成績是Java進修中的最基本的一個成績,然則依然有很多方才進修Java的同窗弄不清晰外面的道理,比來和同伙評論辯論到這個成績,所以寫篇文章給年夜家分享一下我本身的懂得。
起首讓我們看一個例子:
public class TestStringEquals {
public static void main(String[] args) {
String a = "test";
String b = "test";
String c = new String("test");
String d = new String("test");
String e = a;
String f = new String(a);
String g = a + "";
System.out.println(a == b ? "expression \"a==b\" is true"
: "expression \"a==b\" is false");
System.out.println(a == c ? "expression \"a==c\" is true"
: "expression \"a==c\" is false");
System.out.println(c == d ? "expression \"c==d\" is true"
: "expression \"c==d\" is false");
System.out.println(a == e ? "expression \"a==e\" is true"
: "expression \"a==e\" is false");
System.out.println(a == f ? "expression \"a==f\" is true"
: "expression \"a==f\" is false");
System.out.println(a == g ? "expression \"a==g\" is true"
: "expression \"a==g\" is false");
if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
System.out
.println("a equals b equals c equals d equals e equals f equals g");
}
}
}
假如先不謎底,年夜家試著去做一做,可否包管全體准確呢?
上面頒布一下謎底:
expression "a==b" is true
expression "a==c" is false
expression "c==d" is false
expression "a==e" is true
expression "a==f" is false
expression "a==g" is false
<div ></div>a equals b equals c equals d equals e equals f equals g
要很好的懂得這類標題,最好的方法就是深刻懂得Java中String的“==”辦法和“equals”辦法的機制和道理。“equals”想必年夜家都曉得,就是比擬字符串的內容,因為以上法式中的一切字符串內容都是“test”,所以用equals比擬它們都邑相等。
然則你能否曉得Java中基類Obejct的equals辦法跟“==”辦法實際上是分歧的呢?只不外是String類繼續Object類(Java中一切的類都是繼續Object類的)後,重載了equal的辦法,使得其成了比擬字符串中的內容。
很好的懂得了equals以後,如今讓我們來研討一下“==”辦法的虛無缥缈。
“==”是Java中的運算符,它比擬的內容是兩個對象的指針,也就是現實對象的地址。是以很輕易懂得e==a是前往true的。
我們再來看下c和d之間的比擬,看到new症結詞,解釋c和d都是從新請求了一塊內存地址,然後外面賦值為“test”,所以c==d前往的是false。同理都可以懂得
a,c,d,f之間的“==”操作都前往的是false。
然後再來看看g= a + “”,固然沒有看到new症結詞,然則因為String類“+”操作符被重載以後,重載的辦法當中必定會從新new一個String,所以也就釀成了下面的情形。那末最難懂得的就是a和b的比擬了,其實這是Java編譯器的優化所帶來的成果,java編譯器有一個叫字符串常量池的存儲區域,因為String a = "test"這條語句編譯以後,“test”就會存儲在這個字符串常量池中,那末再界說b的時刻,b依然指向這塊區域,所以說a和b指向的依然是統一塊區域。所以a==b前往的true。