[轉]談談Java中"=="與"equals()"

equals是Object超類中的一個方法,這個方法的實現就是經過==號實現的,==號比較的是兩個對象的地址是否相同,在代碼中體現出來就是比較兩個對象引用中保存的地址是否相同,==可以判斷的只是兩個對象引用是否是指向同一個地址也就是同一個對象,因此它的相等判斷是侷限的:java

A a1 = new A();A a2 = a1;這個時候a1 == a2是否爲true?答案是yes,由於兩個對象引用保存的是同一個對象的地址; A a1 = new A();A a2 = new A();這個時候a1 就不 == a2了,由於兩個對象引用指向的是不一樣的對象. 正由於==號只能判斷兩個對象引用是否指向同一個對象,因此決不能用它比較兩個普通對象是否相等,即便兩個對象全部的實例域都相同,雖然這在現實中的語義是兩個對象指的是同一個事物好比同一我的,可是由於在代碼中它們分配在不一樣的地址,因此用==號判斷它們是不相等的. 學過c#的人都知道,c#是能夠用==號進行字符串相等判斷的,那是c#對==進行運算符重載了的,java中沒有運算符重載,哦,有一個,就是+號,可以用來拼接字符串,因此java不能用==號進行字符串相等判斷.c#

對於字符串,有必要深究一下,是否是全部的字符串都不能用==號進行判斷了,答案是no: 虛擬機將字符串常量是共享的,因此對於引用字符串常量的變量是能夠用==號判斷的,可是字符串的其餘操做好比new String("HelloWorld") + substring replace等產生的新字符串不是共享的,因此後面這些方法產生的字符串不能用==號進行判斷.給出下面一個例子: String hello = "hello';//hello是一個字符串常量的引用 if(hello == "hello")//true     ... if(hello.substring(0,3) == "hel")//false     ... 上面的例子中"hello" 和 "hel"都是字符串常量.eclipse

那麼要按照現實世界的語義來比較兩個對象是否相等,好比兩個字符串含有的字符個數同樣,對應索引上的字符同樣也同樣咱們就認爲它們相等,而不是僅僅判斷內存地址來決定,該怎麼辦呢?解決方法就是重寫equals方法,前面說過了Object超類中的equals方法就是用==實現的,因此假如一個類沒有重寫equals方法,那麼當應用a1.equals(a2)時,跟用==號判斷是同樣的,因此要根據對象的實例域來判斷兩個對象是否相等的話必定要重寫equals方法,eclipse有快速生成equals的捷徑,你用到它的時候就知道了.測試

有了equals方法之後,咱們再進行相等判斷就不是根據對象的地址了,而是看你怎麼實現這個equals方法,通常是根據對象的實例域來比較,好比姓名,身份證號,反正是一些特有或通用的屬性,這個eclipse知道.spa

講這麼多隻是告訴你==和equals進行相等測試時有哪些類似的和不一樣的地方,但願對你有所幫助.對象

相關文章
相關標籤/搜索