初學java有段時間了,但是昨晚忽然就被"asd"==getpara("password")搞得不開心了:確實JAVA很多東西和以前接觸過的語言完全不一樣,比如最簡單的new String("asd") !=new String ("asd")。
1 一個最簡單的程序:
1
2
3
4
5
6
7
|
public class A { public static void main(String args[]) { String s1 = "Hello" ; String s2 = "Hello" ; System.out.println(s1 == s2); } } |
肯定很多人說,輸出true,確實是輸出true,s1和s2引用的是同一個東西嘛。但是這個程序如果換一種寫法,那么肯定就不太一樣了。
2 第一種變體:
1
2
3
4
5
6
7
8
|
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)); } } |
或者:
1
2
3
4
5
6
7
8
|
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)); } } |
那么結果就有點不太確定了,有些人很壞的想到了,單獨拿出來,肯定至少有一個不會相等。
這兩個程序的結果都是false true,原因很簡單,JAVA是一個基本完全面向對象的語言,s1 == s2 判斷的是他的引用(相當于內存地址、指針),equals則是使用這個對象自身的方法去判斷值是否相等。
在以下表達式中:
1
2
|
String s1 = "Hello" ; String s2 = new String( "Hello" ); |
JVM得到的是兩個不同的信息:
1.我要創建一個“Hello”字符串。
2.我要創建一個新的“Hello”字符串,不要跟原來的一樣的。
于是,s1 != s2.
3 第二種變體:
順序排列:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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)); } } |
打亂順序排列:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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)); } } |
那么這次應該很清楚了=
兩個object,但是中間加入了一些羞羞的東西,于是答案肯定是true true true true。
那么intern到底是什么。
4 intern作用:
當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。
否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。
intern的適用情況:多個相同的大字符串同時出現的情況,例如可能出現多個相同消息的消息隊列的設計。
以上就是java 中String.equals和==的比較的實例詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:https://segmentfault.com/a/1190000002645999