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