完全一样,比较字符串equals与== 完全没有区别吗?
闭关修行中......
String a1="a"; String a2="a"; String b1=new String("b"); String b2=new String("b"); System.out.println(a1 == a2); System.out.println(a1.equals(a2)); System.out.println(b1 == b2); System.out.println(b1.equals(b2));
結果:
true true false true
==比較的是變數指向物件是否一致,之所以s與s2相等是因為jvm進行最佳化,兩個變數指向一個物件。 equal比較的是物件中保存的字串是否相同。
有些問題 ,其實源碼裡有最好的答案
public boolean equals(Object anObject) { //如果引用的是同一个对象,返回真 if (this == anObject) { return true; } //如果不是String类型的数据,返回假 if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; //如果char数组长度不相等,返回假 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;
== 運算子測試兩個參考是否指向同一個物件。如果要測試兩個不同的物件是否相等,必須使用 equals() 方法。
如果有興趣了解更多,可以看一下我寫的一篇文章。 Java快速掃盲指南
感覺你提問很有問題,你是如何從貼出的程式碼中得到文字描述的結論的? 我這裡大概猜測一下你的意圖,勉強回答。 在java中,==和equal方法是不同的,簡單描述如下:
==
==用來判斷兩個引用是否指向相同的對象,如 Object a = new Object(); Object b = a; a == b; // ==> true
equal
equal方法用來判斷兩個物件是否相等。這個方法在頂層類別Object中就已經定義了,在Object中該方法的實作就是用的==來比較引用是否相等。任何子類別如果想要使用equal方法,最好覆寫Object的equal方法,提供自己的相等邏輯。如下定義一個Person類別。
public class Person { private String name; private int age; // ... @Override public boolean equal(Object o) { if(o instanceof Person) { return o.getName().equal(name) && o.getAge() == age; } else { return false; } } }
s 和 s2 都是直接引用的常量 "12",编译器会优化代码,只创建一个 "12" String 对象,由两个变量来引用,所以 s == s2。但是如果你的另一个 "12" 是由其它方式创建的,比如 new String("12"),或者 "1234".substring(0, 2),你就会发现 == 不好使了,而 equals 是对内容进行比较。看 equals 的原码你会发现它也是先使用 == 比較引用的
s
s2
new String("12")
"1234".substring(0, 2)
equals
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof 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; }
new出來就不一樣了
首先要考慮equals跟==的作用:==相當於是比較兩個物件的引用,而equals方法是Object類別中定義的,String類別對其進行了重寫,原始程式碼可以看樓上的分析,首先也使用==比較了引用,之後比較內容。 我們在比較兩個字串時,大多是想比較內容,所以使用equals方法。如果你使用==,IDE其實是會拋一個警告的。
那為什麼你這裡的==與equals方法效果一樣呢,就要看使用「=」建立字串物件與使用new建立字串的區別。 不知道有沒有去了解字串池,我的理解也不深,需要的話可以自己看看。 第一次使用“=”創建字串物件時,會查看字串池中有沒有“12”,如果沒有,那麼就添加一個到池中,然後把引用返回給s;之後再創建s2時,發現池中有,那麼直接將這個引用賦給s2,所以s和s2的引用是相同的,造成==比較為true。 可以用new的方式建立字串,然後看看效果:
String s1 = "12"; String s2 = "12"; String s3 = new String("12"); System.out.println(s1 == s2);//true System.out.println(s1.equals(s2));//true System.out.println(s1 == s3);//false System.out.println(s1.equals(s3));//true
使用new關鍵字建立字串物件時,每次都會新建立一個對象,然後把引用賦給變數。
都說的不錯,建議你搜尋字串常數池,會讓你有深刻體會的
題主你的s1和s2內容是一樣的,你這種賦值方式是這樣的,首先s1會將字串「…」放到JVM虛擬機的常數池中,第二次賦值s2的時候會優先判斷常數池中是否包含這個字串,如果有就指向他。 所以即使你用==也會相等。 如果你s2使用new string(123),這時引用地址不同了,就不相等了。 手機碼字不容易。
結果:
==比較的是變數指向物件是否一致,之所以s與s2相等是因為jvm進行最佳化,兩個變數指向一個物件。
equal比較的是物件中保存的字串是否相同。
有些問題 ,其實源碼裡有最好的答案
== 運算子測試兩個參考是否指向同一個物件。如果要測試兩個不同的物件是否相等,必須使用 equals() 方法。
如果有興趣了解更多,可以看一下我寫的一篇文章。 Java快速掃盲指南
感覺你提問很有問題,你是如何從貼出的程式碼中得到文字描述的結論的?
我這裡大概猜測一下你的意圖,勉強回答。
在java中,==和equal方法是不同的,簡單描述如下:
==
==用來判斷兩個引用是否指向相同的對象,如
Object a = new Object();
Object b = a;
a == b; // ==> true
equal
equal方法用來判斷兩個物件是否相等。這個方法在頂層類別Object中就已經定義了,在Object中該方法的實作就是用的==來比較引用是否相等。任何子類別如果想要使用equal方法,最好覆寫Object的equal方法,提供自己的相等邏輯。如下定義一個Person類別。
s
和s2
都是直接引用的常量 "12",编译器会优化代码,只创建一个 "12" String 对象,由两个变量来引用,所以 s == s2。但是如果你的另一个 "12" 是由其它方式创建的,比如new String("12")
,或者"1234".substring(0, 2)
,你就会发现==
不好使了,而equals
是对内容进行比较。看equals
的原码你会发现它也是先使用==
比較引用的new出來就不一樣了
首先要考慮equals跟==的作用:
==相當於是比較兩個物件的引用,而equals方法是Object類別中定義的,String類別對其進行了重寫,原始程式碼可以看樓上的分析,首先也使用==比較了引用,之後比較內容。
我們在比較兩個字串時,大多是想比較內容,所以使用equals方法。如果你使用==,IDE其實是會拋一個警告的。
那為什麼你這裡的==與equals方法效果一樣呢,就要看使用「=」建立字串物件與使用new建立字串的區別。
不知道有沒有去了解字串池,我的理解也不深,需要的話可以自己看看。
第一次使用“=”創建字串物件時,會查看字串池中有沒有“12”,如果沒有,那麼就添加一個到池中,然後把引用返回給s;之後再創建s2時,發現池中有,那麼直接將這個引用賦給s2,所以s和s2的引用是相同的,造成==比較為true。
可以用new的方式建立字串,然後看看效果:
使用new關鍵字建立字串物件時,每次都會新建立一個對象,然後把引用賦給變數。
都說的不錯,建議你搜尋字串常數池,會讓你有深刻體會的
題主你的s1和s2內容是一樣的,
你這種賦值方式是這樣的,
首先s1會將字串「…」放到JVM虛擬機的常數池中,
第二次賦值s2的時候會優先判斷常數池中是否包含這個字串,如果有就指向他。
所以即使你用==也會相等。
如果你s2使用new string(123),這時引用地址不同了,就不相等了。
手機碼字不容易。