日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈equals与==

發布時間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈equals与== 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

示例代碼:

public static void main(String[] args) throws IOException {String str1 = new String("hello");String str2 = new String("hello");String str3 = "cde";String str4 = "cde";int i1 = 3;int i2 = 3;Integer i3 = new Integer(4);Integer i4 = new Integer(4);System.out.println(str1 == str2); //falseSystem.out.println(str1.equals(str2)); //trueSystem.out.println(str3 == str4); //trueSystem.out.println(str3.equals(str4)); //trueSystem.out.println(i1 == i2); //trueSystem.out.println(i3 == i4); //false}

返回結果:

false true true true true false

為什么str1與str2輸出的結果不一樣而str3與str4輸出的結果一樣,i1與i2輸出結果一樣而i3與i4輸出結果不一樣呢?==和equals方法之間的區別是什么?如果在初學Java的時候這個問題不弄清楚,就會導致自己在以后編寫代碼時出現一些低級的錯誤。今天就來一起了解一下==和equals方法的區別之處。

二、區別

i1==i2結果為true,這個很容易理解,變量i1和變量i2存儲的值都為3,肯定是相等的。而為什么str1和str2兩次比較的結果不同?要理解這個其實只需要理解基本數據類型變量和非基本數據類型變量的區別。

在Java中有8種基本數據類型:

  • 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

  • 浮點型:float(4 byte), double(8 byte)

  • 字符型: char(2 byte)

  • 布爾型: boolean(JVM規范沒有明確規定其所占的空間大小,僅規定其只能夠取字面值”true”和”false”)

對于這8種基本數據類型的變量,變量直接存儲的是“值”,因此在用關系操作符==來進行比較時,比較的就是 “值” 本身。要注意浮點型和整型都是有符號類型的,而char是無符號類型的(char類型取值范圍為0~2^16-1)。

也就是說比如:

int i1=3;int i2=3; 

變量i1和變量i2都是直接存儲的”3”這個數值,所以用==比較的時候結果是true。

而對于非基本數據類型的變量,在一些書籍中稱作為 引用類型的變量。比如上面的str1就是引用類型的變量,引用類型的變量存儲的并不是 “值”本身,而是于其關聯的對象在內存中的地址。比如下面這行代碼:

String str1;

這句話聲明了一個引用類型的變量,此時它并沒有和任何對象關聯。

而 通過new String(“hello”)來產生一個對象(也稱作為類String的一個實例),并將這個對象和str1進行綁定:

str1= new String("hello");

那么str1指向了一個對象(很多地方也把str1稱作為對象的引用),此時變量str1中存儲的是它指向的對象在內存中的存儲地址,并不是“值”本身,也就是說并不是直接存儲的字符串”hello”。這里面的引用和C/C++中的指針很類似。

因此在用==對str1和str2進行比較時,得到的結果是false。因此它們分別指向的是不同的對象,也就是說它們實際存儲的內存地址不同。

equals方法是基類Object中的方法,因此對于所有的繼承于Object的類都會有該方法。為了更直觀地理解equals方法的作用,直接看Object類中equals方法的實現。

下面是Object類中equals方法的實現:

public boolean equals(Object obj) {return (this == obj); }

很顯然,在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。

但是有些朋友又會有疑問了,為什么str1與str2的equals比較輸出結果是true?

要知道究竟,可以看一下String類的equals方法的具體實現。

下面是String類中equals方法的具體實現:

@Override public boolean equals(Object other) {if (other == this) {return true;}if (other instanceof String) {String s = (String)other;int count = this.count;if (s.count != count) {return false;}// TODO: we want to avoid many boundchecks in the loop below// for long Strings until we have array equality intrinsic.// Bad benchmarks just push .equals without first getting a// hashCode hit (unlike real world use in a Hashtable). Filter// out these long strings here. When we get the array equality// intrinsic then remove this use of hashCode.if (hashCode() != s.hashCode()) {return false;}char[] value1 = value;int offset1 = offset;char[] value2 = s.value;int offset2 = s.offset;for (int end = offset1 + count; offset1 < end; ) {if (value1[offset1] != value2[offset2]) {return false;}offset1++;offset2++;}return true;} else {return false;}}

可以看出,String類對equals方法進行了重寫,用來比較指向的字符串對象所存儲的字符串是否相等。

其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的內容是否相等。


到此還沒有結束,在示例代碼中還有str3和str4,這兩個對象的==和equals比較結果都返回true,這與str1與str2的情況不符,為什么呢?這里涉及到String的緩沖池問題。

分析如下:

String作為一個對象來使用

例子一:對象不同,內容相同,”==”返回false,equals返回true

String s1 = new String("java"); String s2 = new String("java");System.out.println(s1==s2); //false System.out.println(s1.equals(s2)); //true

運行結果:

false true

例子二:同一對象,”==”和equals結果相同

String s1 = new String("java"); String s2 = s1;System.out.println(s1==s2); //true System.out.println(s1.equals(s2)); //true

運行結果:

true true

String作為一個基本類型來使用

如果值不相同,對象就不相同,所以”==” 和equals結果一樣

String s1 = "java"; String s2 = "java";System.out.println(s1==s2); //true System.out.println(s1.equals(s2)); //true

運行結果:

true true
  • 如果String緩沖池內不存在與其指定值相同的String對象,那么此時虛擬機將為此創建新的String對象,并存放在String緩沖池內。

  • 如果String緩沖池內存在與其指定值相同的String對象,那么此時虛擬機將不為此創建新的String對象,而直接返回已存在的String對象的引用。

想了解String緩沖池的,可以看看這篇文章:Java提高篇 —— String緩沖池

三、總結

對于==而言

  • 如果作用于基本數據類型的變量,則直接比較其存儲的 “值”是否相等

  • 如果作用于引用類型的變量,則比較的是所指向的對象的地址

對于equals而言

  • equals方法不能作用于基本數據類型的變量

  • 如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址

  • 諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容

總結

以上是生活随笔為你收集整理的浅谈equals与==的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。