java 中String.equals和==的比較
java 中String.equals和==的比較
初學(xué)java有段時(shí)間了,但是昨晚忽然就被"asd"==getpara("password")搞得不開心了:確實(shí)JAVA很多東西和以前接觸過的語(yǔ)言完全不一樣,比如最簡(jiǎn)單的new String("asd") !=new String ("asd")。
1 一個(gè)最簡(jiǎn)單的程序:
public class A {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);
}
}
肯定很多人說(shuō),輸出true,確實(shí)是輸出true,s1和s2引用的是同一個(gè)東西嘛。但是這個(gè)程序如果換一種寫法,那么肯定就不太一樣了。
2 第一種變體:
public class A {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = new String("Hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
或者:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
那么結(jié)果就有點(diǎn)不太確定了,有些人很壞的想到了,單獨(dú)拿出來(lái),肯定至少有一個(gè)不會(huì)相等。
這兩個(gè)程序的結(jié)果都是false true,原因很簡(jiǎn)單,JAVA是一個(gè)基本完全面向?qū)ο蟮恼Z(yǔ)言,s1 == s2 判斷的是他的引用(相當(dāng)于內(nèi)存地址、指針),equals則是使用這個(gè)對(duì)象自身的方法去判斷值是否相等。
在以下表達(dá)式中:
String s1 = "Hello";
String s2 = new String("Hello");
JVM得到的是兩個(gè)不同的信息:
1.我要?jiǎng)?chuàng)建一個(gè)“Hello”字符串。
2.我要?jiǎng)?chuàng)建一個(gè)新的“Hello”字符串,不要跟原來(lái)的一樣的。
于是,s1 != s2.
3 第二種變體:
順序排列:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = "Hello";
s1=s1.intern();
s2=s2.intern();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
}
}
打亂順序排列:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s3 = "Hello";
s1=s1.intern();
String s2 = new String("Hello");
s2=s2.intern();
//也可以String s2 = new String("Hello").intern();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
}
}
那么這次應(yīng)該很清楚了=
兩個(gè)object,但是中間加入了一些羞羞的東西,于是答案肯定是true true true true。
那么intern到底是什么。
4 intern作用:
當(dāng)調(diào)用 intern 方法時(shí),如果池已經(jīng)包含一個(gè)等于此 String 對(duì)象的字符串(該對(duì)象由 equals(Object) 方法確定),則返回池中的字符串。
否則,將此 String 對(duì)象添加到池中,并且返回此 String 對(duì)象的引用。
intern的適用情況:多個(gè)相同的大字符串同時(shí)出現(xiàn)的情況,例如可能出現(xiàn)多個(gè)相同消息的消息隊(duì)列的設(shè)計(jì)。
以上就是java 中String.equals和==的比較的實(shí)例詳解,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
淺談spring中用到的設(shè)計(jì)模式及應(yīng)用場(chǎng)景
下面小編就為大家?guī)?lái)一篇淺談spring中用到的設(shè)計(jì)模式及應(yīng)用場(chǎng)景。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08
Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼
這篇文章主要介紹了Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼,需要的朋友可以參考下2017-09-09
Spring框架構(gòu)造注入type屬性實(shí)例詳解
這篇文章主要介紹了Spring框架構(gòu)造注入type屬性實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

