java == 与 equals 相同与不同点
java中與很多有意思又值得深究的點。
寫這篇文章呢,是由于在百度知道中看到一個問題:怎樣比較兩個對象是否相同。這又使我想到了另外一個問題,== 和 equals有什么不同?寫了幾行代碼,看了幾篇文章,將見解列出來,分享。
在闡述之前請大家先看一段代碼。
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");}} }輸出結果:
int1 equals int2
str1 equals str2
各位也都知道,java中萬物皆對象。那么也有,java中所有聲明出來的對象全都繼承Object對象。
第一次看到這段代碼的輸出結果我也是很吃驚的,很奇怪啊。我奇怪的地方有兩點:
1、int1和int2的值明明相等,可是卻不是==,非常奇怪。
2、int1和int2明明是兩個對象,可是卻能equals相等,更加奇怪。
對于1,我奇怪的是==比較的是數值相等啊。可是兩個明明相等的值卻不想等。可是后來查了很多資料之后看到了這么一句話:
對于==,如果作用于基本數據類型的變量,則直接比較其存儲的 “值”是否相等;
如果作用于引用類型的變量,則比較的是所指向的對象的地址;(引用,原文鏈接在文末)
這就很明了了,也就是說==在比較的int1和int2的時候比的對象的地址,那么分別兩次new出來的對象地址自然不可能相同。
對于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對Object的equals方法進行了重寫都分別比較的是對象的值。所以才會有第二種結果的產生,其實仔細想想也是,總不可能沒有能夠正確比較的方法吧。
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
總結,即:
1)對于==,如果作用于基本數據類型的變量,則直接比較其存儲的 “值”是否相等;
如果作用于引用類型的變量,則比較的是所指向的對象的地址
2)對于equals方法,注意:equals方法不能作用于基本數據類型的變量
如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;
諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容
原有兩段話的原文地址:http://www.cnblogs.com/dolphin0520/p/3592500.html
轉載于:https://www.cnblogs.com/yidiandhappy/p/6397635.html
總結
以上是生活随笔為你收集整理的java == 与 equals 相同与不同点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAS单点登录3--服务端登录页个性化
- 下一篇: linux系统被***后处理经历