有兩種用法說明:
(
1)對於字串變數來說,使用
「==」
和「equals()」
方法比較字串時,其比較方法不同。
「==」
比較兩個變數本身的值,即兩個物件在記憶體中的首位址。
「equals()」
比較字串中所包含的內容是否相同。
比如:string s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new string("abc");
s2 = new string("abc");
那麼:s1==s2
是false //
兩個變數的記憶體位址不一樣,也就是說它們指向的物件不
一樣,故不相等。
s1.equals(s2)
是true //
兩個變數的所包含的內容是
abc,故相等。
注意(1):
如果:stringbuffer s1 = new stringbuffer("a");
stringbuffer s2 = new stringbuffer("a");
結果:s1.equals(s2) //
是false
解釋:stringbuffer
類中沒有重新定義
equals
這個方法,因此這個方法就來自
object類,
而object
類中的equals
方法是用來比較「位址
」的,所以等於
false.
注意(2):
對於s3和
s4來說,有一點不一樣要引起注意,由於s3和
s4是兩個字元
串常量所生成的變數,其中所存放的記憶體位址是相等的,
所以s3==s4
是true
(即使沒有
s3=s4
這樣乙個賦值語句)
(
2)對於非字串變數來說,
"=="
和"equals"
方法的作用是相同的都是用來比較其
物件在堆記憶體的首位址,即用來比較兩個引用變數是否指向同乙個物件。
比如:class a
那麼:obj1==obj2
是false
obj1.equals(obj2)
是false
但是如加上這樣一句:
obj1=obj2;
那麼obj1==obj2
是true
obj1.equals(obj2)
是true
總之:equals
方法對於字串來說是比較內容的,而對於非字串來說是比較
其指向的物件是否相同的。
== 比較符也是比較指向的物件是否相同的也就是物件在對記憶體中的的首位址。
string
類中重新定義了
equals
這個方法,而且比較的是值,而不是位址。所以是
true。
關於
equals與==
的區別從以下幾個方面來說:
(
1)如果是基本型別比較,那麼只能用
==來比較,不能用
equals
比如:public class testequals }
(
2)對於基本型別的包裝型別,比如
boolean
、character
、byte
、shot
、integer
、long
、float
、double
等的引用變數,
==是比較位址的,而
equals
是比較內容的。比如:
public class testequals }這是
integer
的例項,如果是其他的比如
double
、character
、float
等也一樣。
(
3)注意:對於
string(
字串)
、stringbuffer(
執行緒安全的可變字串行)、
stringbuilder(
可變字串行
)這三個類作進一步的說明。(a
)首先,介紹
string
的用法,請看下面的例項:
public class testequals }
答案解釋:s1與
s2分別指向由字串常量
」123」
建立的物件,在常量池中,只有乙個物件,內容為
123,有兩個引用s1和
s2指向這個物件,故這兩個引用變數所指向的位址是相同的,因而(
1)處的執行結果為
true
,又因為
s1.equals(s2)
是比較s1和s2
所指向的物件的內容是否相等,而我們知道這兩個物件的內容都是字串常量
」123」
,故標記(
2)處的執行結果是
true
。用同樣的方法分析,s1和
s3所指向的物件不一樣,內容也不一樣,故標記(
3)和(
4)處執行結果是
false
。再看看s4和
s5,這兩個引用變數所指向的物件的內容都是一樣的(內容都是
123),但是這兩個物件是用
new操作符建立處類的,是在記憶體中分配兩塊空間給這兩個物件的,因而這兩個物件的記憶體位址不一樣,故事兩個不同的物件,標記(
5)處的
s4 == s5
執行結果為
false
,但是內容一樣,故標記(
6)處的
s4.equals(s5)
執行結果為
true
。同理,s4和
s6所指向的物件位址不同,內容也不相同。故標記(7)(
8)處執行結果為
false。s1
和s4分別指向兩個不同的物件(之所以這樣稱呼,是因為這兩個物件在記憶體中的位址不相同,故而物件不相同),故標記為(
9)處的
s1 == s4
執行結果為
false
,而標記為(
10)處的
s1.equals(s4)
執行結果疑問:乍一看結果,有點驚訝,為什麼不是
true
呢,不是說
equals
方法是比較內容的嗎?
解釋:不錯,如果在新類中被覆蓋了
equals
方法,就可以用來比較內容的。但是在上面的例子中類
value
並沒有覆蓋
object
中的equals
方法,而是繼承了該方法,因此它就是被用來比較位址的,又v1和
v2的所指向的物件不相同,故標記(
1)處的
v1.equals(v2)
執行結果為
false
,標記為(
2)處的
v1 == v2
執行結果也為
false。
java中equals方法和「 」的區別
有兩種用法說明 1 對於字串變數來說,使用 和 equals 方法比較字串時,其比較方法不同。比較兩個變數本身的值,即兩個物件在記憶體中的首位址。equals 比較字串中所包含的內容是否相同。2 對於非字串變數來說,和 equals 方法的作用是相同的都是用來比較其物件在堆記憶體的首位址,即用來比較...
java中equals方法和「 」的比較
關於equals與 的區別從以下幾個方面來說 1 如果是基本型別比較,那麼只能用 來比較,不能用equals 比如 public class testequals 2 對於基本型別的包裝型別,比如boolean character byte shot integer long float doubl...
Java中的equals方法
object類中的equals方法用於檢測乙個物件是否等於另乙個物件。在object類中,這個方法將判斷兩個物件是否具有相同的引用。getclass方法將返回物件所屬的類。instanceof關鍵字用於判斷當前物件是否是屬於當前類 下面給出編寫乙個完美的equals方法的建議 1.顯示引數命名為ot...