java基础之 “==”和“ equals”以及instanceof的区别
1)對于字符串變量來說,使用“==”和“equals()”方法比較字符串時,其比較方法不同。
“==”比較兩個變量本身的值,即兩個對象在內存中的首地址。“equals()”比較字符串中所包含的內容是否相同。比如:
String s1,s2,s3 = "abc", s4 ="abc" ;s1 = new String("abc");s2 = new String("abc");那么:
s1==s2 是 false //兩個變量的內存地址不一樣,也就是說它們指向的對象不 一樣,故不相等。
s1.equals(s2) 是 true //兩個變量的所包含的內容是abc,故相等。
注意(1):
如果:
StringBuffer s1 = new StringBuffer("a");StringBuffer s2 = new StringBuffer("a");結果: s1.equals(s2) //是false
解釋:
StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類, 而Object類中的equals方法是用來比較“地址”的,所以等于false.
注意(2):
對于s3和s4來說,有一點不一樣要引起注意,由于s3和s4是兩個字符
串常量所生成的變量,其中所存放的內存地址是相等的,所以s3==s4是true(即使沒有s3=s4這樣一個賦值語句)
(2)對于非字符串變量來說:
"=="和"equals"方法的作用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
比如:
class A{A obj1 = new A();A obj2 = new A();}那么:obj1==obj2是falseobj1.equals(obj2)是false但是如加上這樣一句:obj1=obj2;那么 obj1==obj2 是trueobj1.equals(obj2) 是true總之:
equals方法對于字符串來說是比較內容的,而對于非字符串來說是比較其指向的對象是否相同的。
== 比較符也是比較指向的對象是否相同的也就是對象在對內存中的的首地址。
String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以是true。
順便總結下equals方法和instanceof 的區別:
instanceof操作符用于判斷一個引用類型所引用的對象是否是一個類的實例,對于引用類型變量,Java 編譯器只根據變量被先生聲明的類去編譯。 instanceof 左邊操作元被顯式聲明的類型與右邊操作元必須是同種類或者有繼承關系,即位于繼承樹的同一個繼承分支上,否則編譯出錯Object 類的 equals() 方法的比較規則為:當參數 obj 引用的對象與當前對象為同一個對象時,就返回true,否則返回false
在JDK中有一些類覆蓋了 Object 類的equals()方法,它們的比較規則為:
如果兩個對象的類型一致,并且內容一致,則返回true。
這些類包括:java.io.File、java.util.Date、java.lang.String、包裝類(如java.lang.Integer和java.lang.Double類)。
如果是自己定義的類的話,可以復寫equals()方法,自己定義比較規則
Java語言對equals()的要求如下,這些要求是必須遵循的,以下幾點也算是和instance of 的區別:
? 對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應該返回是“true”。 ? 反射性:x.equals(x)必須返回是“true”。 ? 類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應該返回是“true”。 ? 還有一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。 ? 任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。轉自:http://blog.csdn.net/t12x3456/article/details/7341515
總結
以上是生活随笔為你收集整理的java基础之 “==”和“ equals”以及instanceof的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么解决java.lang.NoClas
- 下一篇: java基础之抽象类和接口