java篇 之 ==与equals
==是一個(gè)比較運(yùn)算符,基本數(shù)據(jù)類型比較的是值,引用數(shù)據(jù)類型比較的是地址值。
"=="比"equals"運(yùn)行速度快,因?yàn)?#34;=="只是比較引用。
== 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)對(duì)象。比較的是真正意義上的指針操作。
1、比較的是操作符兩端的操作數(shù)是否是同一個(gè)對(duì)象。
2、兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過(guò)。
3、比較的是地址,如果是具體的阿拉伯?dāng)?shù)字的比較,值相等則為true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因?yàn)樗麄兌贾赶虻刂窞?/span>10的堆。
equals:
equals用來(lái)比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對(duì)象,如果沒(méi)有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。
String是類類型,引用類型
String s="abce"是一種非常特殊的形式,和new 有本質(zhì)的區(qū)別。它是java中唯一不需要new 就可以產(chǎn)生對(duì)象的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字符串,在JVM內(nèi)部發(fā)生字符串拘留,即當(dāng)聲明這樣的一個(gè)字符串后,JVM會(huì)在常量池中先查找有有沒(méi)有一個(gè)值為"abcd"的對(duì)象,如果有,就會(huì)把它賦給當(dāng)前引用.即原來(lái)那個(gè)引用和現(xiàn)在這個(gè)引用指點(diǎn)向了同一對(duì)象,如果沒(méi)有,則在常量池中新創(chuàng)建一個(gè)"abcd",下一次如果有String s1 = "abcd";又會(huì)將s1指向"abcd"這個(gè)對(duì)象,即以這形式聲明的字符串,只要值相等,任何多個(gè)引用都指向同一對(duì)象.
而String s = new String("abcd");和其它任何對(duì)象一樣.每調(diào)用一次就產(chǎn)生一個(gè)對(duì)象,只要它們調(diào)用。
也可以這么理解: String str = "hello"; 先在內(nèi)存中找是不是有"hello"這個(gè)對(duì)象,如果有,就讓str指向那個(gè)"hello".如果內(nèi)存里沒(méi)有"hello",就創(chuàng)建一個(gè)新的對(duì)象保存"hello". String str=new String ("hello") 就是不管內(nèi)存里是不是已經(jīng)有"hello"這個(gè)對(duì)象,都新建一個(gè)對(duì)象保存"hello"。
?
由equals的源碼可以看出這里定義的equals與==是等效的,(Object類中的equals沒(méi)什么區(qū)別),不同的原因就在于有些類(像String、Integer等類)對(duì)equals進(jìn)行了重寫,但是沒(méi)有對(duì)equals進(jìn)行重寫的類,就只能從Object類中繼承equals方法,其equals方法與==就也是等效的。
轉(zhuǎn)載于:https://www.cnblogs.com/wskb/p/10811561.html
總結(jié)
以上是生活随笔為你收集整理的java篇 之 ==与equals的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。