java == 与 equals 相同与不同点
java中與很多有意思又值得深究的點(diǎn)。
寫(xiě)這篇文章呢,是由于在百度知道中看到一個(gè)問(wèn)題:怎樣比較兩個(gè)對(duì)象是否相同。這又使我想到了另外一個(gè)問(wèn)題,== 和 equals有什么不同?寫(xiě)了幾行代碼,看了幾篇文章,將見(jiàn)解列出來(lái),分享。
在闡述之前請(qǐng)大家先看一段代碼。
public class Equals {public static void main(String[] args) {Integer int1 = new Integer(1);Integer int2 = new Integer(1);String str1 = new String("Hello World");String str2 = new String("Hello World");if(int1==int2){System.out.println("int1 == int2");}if(int1.equals(int2)){System.out.println("int1 equals int2");}if(str1==str2){System.out.println("str1 == str2");}if(str1.equals(str2)){System.out.println("str1 equals str2");}} }輸出結(jié)果:
int1 equals int2
str1 equals str2
各位也都知道,java中萬(wàn)物皆對(duì)象。那么也有,java中所有聲明出來(lái)的對(duì)象全都繼承Object對(duì)象。
第一次看到這段代碼的輸出結(jié)果我也是很吃驚的,很奇怪啊。我奇怪的地方有兩點(diǎn):
1、int1和int2的值明明相等,可是卻不是==,非常奇怪。
2、int1和int2明明是兩個(gè)對(duì)象,可是卻能equals相等,更加奇怪。
對(duì)于1,我奇怪的是==比較的是數(shù)值相等啊??墒莾蓚€(gè)明明相等的值卻不想等。可是后來(lái)查了很多資料之后看到了這么一句話(huà):
對(duì)于==,如果作用于基本數(shù)據(jù)類(lèi)型的變量,則直接比較其存儲(chǔ)的 “值”是否相等;
如果作用于引用類(lèi)型的變量,則比較的是所指向的對(duì)象的地址;(引用,原文鏈接在文末)
這就很明了了,也就是說(shuō)==在比較的int1和int2的時(shí)候比的對(duì)象的地址,那么分別兩次new出來(lái)的對(duì)象地址自然不可能相同。
對(duì)于2,
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = count;if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {if (v1[i++] != v2[j++])return false;}return true;}}return false;}則可以看到,在String或者Integer中都可以看到,java對(duì)Object的equals方法進(jìn)行了重寫(xiě)都分別比較的是對(duì)象的值。所以才會(huì)有第二種結(jié)果的產(chǎn)生,其實(shí)仔細(xì)想想也是,總不可能沒(méi)有能夠正確比較的方法吧。
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
總結(jié),即:
1)對(duì)于==,如果作用于基本數(shù)據(jù)類(lèi)型的變量,則直接比較其存儲(chǔ)的 “值”是否相等;
如果作用于引用類(lèi)型的變量,則比較的是所指向的對(duì)象的地址
2)對(duì)于equals方法,注意:equals方法不能作用于基本數(shù)據(jù)類(lèi)型的變量
如果沒(méi)有對(duì)equals方法進(jìn)行重寫(xiě),則比較的是引用類(lèi)型的變量所指向的對(duì)象的地址;
諸如String、Date等類(lèi)對(duì)equals方法進(jìn)行了重寫(xiě)的話(huà),比較的是所指向的對(duì)象的內(nèi)容
原有兩段話(huà)的原文地址:http://www.cnblogs.com/dolphin0520/p/3592500.html
轉(zhuǎn)載于:https://www.cnblogs.com/yidiandhappy/p/6397635.html
總結(jié)
以上是生活随笔為你收集整理的java == 与 equals 相同与不同点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CAS单点登录3--服务端登录页个性化
- 下一篇: token的理解