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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?

發布時間:2024/8/23 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

部分面試資料鏈接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA

密碼:jsam

想獲得全部面試必看資料,關注公眾號,大家可以在公眾號后臺回復“知乎”即可。

“判斷兩個事物是否相等”,是編程中最常見的操作之一,在Java中,判斷是否相等有兩種方法,一種是使用“==”判斷符,另一種是使用“equals()”方法,你是否曾因混用二者導致不可思議的bug?本篇文章將帶你深入二者背后的判斷原理。

相等判斷符"=="

"=="相等判斷符用于比較基本數據類型和引用類型數據。當比較基本數據類型的時候比較的是數值,當比較引用類型數據時比較的是引用(指針)。

"=="判斷基本類型數據

基本數據類型指的是Java中的八大數據類型:byte,short,int,long,float,double,char,boolean。

這八大基本數據類型有個共同的特點是它們在內存中是有具體值的, 比如說一個 int 類型的數據"2",它在8位數據總線的機器上保存形式為 0000 0010。(8位機器是假設的)

當使用 == 比較兩個基本數據類型的時候, 就是在比較它們各自在內存中的值。

為了照顧到要刨根問底的同學,再補充一下兩個數值是怎么比較的:cpu 在比較的時候會將兩個值作差,然后查看標志寄存器。標志寄存器存放的是運算的結果,里面有一個是否為0的標志位,如果該位為1,證明二者之差為0,二者相等。

"=="判斷引用類型數據

引用數據類型在字面上也是很好理解的, 它就是一個引用, 指向堆內存中一個具體的對象。

比如說Student stu = new Student(); 這里的 stu 就是一個引用,它指向的是當前 new 出來的 Student 對象. 當我們想要操作這個 Student 對象時, 只需要操作引用即可, 比如說int age = stu.getAge();。

所以用"=="判斷兩個引用數據類型是否相等的時候,實際上是在判斷兩個引用是否指向同一個對象。

看下面的示例:

public static void main(String[] args) {String s1 = "hello"; //s1指向字符串常量池中的"hello"字符串對象String s2 = "hello"; //s2也指向字符串常量池中的"hello"字符串對象System.out.println(s1 == s2); //trueString s3 = new String("hello"); //s3指向的是堆內存中的字符串對象 System.out.println(s1 == s3); //false }

從上面的例子可以看到,由于引用"s1"和"s2"指向的都是常量池中的"hello"字符串,所以返回true。(后面我會發布一篇詳細講述Java字符串的文章,涉及字符串初始化和字符串常量池等知識)

而"s3"指向的是新創建字符串對象,因為只要動用了new關鍵字, 就會在堆內存創建一個新的對象。

也就是說 s1 和 s3 指向的是不同的字符串對象,所以返回false。

相等判斷方法equals()

equals()和 == 有著本質的區別,== 可以看作是對“操作系統比較數據手段”的封裝,而equals()則是每個對象自帶的比較方法,它是Java自定義的比較規則。

equals()和 == 的本質區別更通俗的說法是:==的比較規則是定死的,就是比較兩個數據的值。

而 equals() 的比較規則是不固定的,可以由用戶自己定義。

看下面的例子:

public static void main(String[] args) {String s1 = "hello";String s3 = new String("hello"); System.out.println(s1.equals(s3)); //true }

回想前面的案例:用 == 比較的時候, 上面 s1 和 s3 比較出的結果為false。而當用 equals() 比較的時候,得出的結果為 true。

想知道原因我們還得看源碼,下面是 String 類中的 equals() 方法的源碼。

public boolean equals(Object anObject) {if (this == anObject) { //先比較兩個字符串的引用是否相等(是否指向同一個對象), 是直接返回truereturn true;}if (anObject instanceof String) { //兩個引用不等還會繼續比較String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value; //字符串類是用字符數組實現的, 先要拿到兩個字符串的字符數組char v2[] = anotherString.value;int i = 0;while (n-- != 0) { //然后對兩個數組逐個字符地進行比較if (v1[i] != v2[i])return false;i++;}return true;}}return false; }

從上面的源碼可以看到, 當調用 String 類型數據的 equals() 方法時,首先會判斷兩個字符串的引用是否相等,也就是說兩個字符串引用是否指向同一個對象,是則返回true。

如果不是指向同一個對象,則把兩個字符串中的字符挨個進行比較。由于 s1 和 s3 字符串都是 "hello",是可以匹配成功的,所以最終返回 true。

思考:為什么要設計equals()方法?

通過上面的講解,相信你已經知道 == 和 equals() 的區別了:一個的比較規則是定死的,一個是可以由編程人員自己定義的。

可是為什么會有 equals() 方法, 而且還可以被自由定制呢?

這個問題要落到Java語言的核心 —— 面向對象思想了。

Java 不同于面向過程的C語言,Java是一款面向對象的高級語言。如果是面向過程編程,直接操作內存上存儲的數據的話,用 == 所定義的規則來判斷兩個數據是否相等已經足夠了。

而Java中萬物皆對象,我們經常要面臨的問題是這兩個對象是否相等,而不是這兩串二進制數是否相等,僅有 == 是完全不夠用的。

由于Java程序員們會創建各種滿足它們業務需求的對象,系統無法提前知道兩個對象在什么條件下算相等,Java干脆把判斷對象是否相等的權力交給編程人員。

具體的措施是:所有的類都必須繼承 Object 類,而 Object 類中寫有equals()方法。編程人員可以通過重寫 equals() 方法來實現自己的比較策略,也可以不重寫,使用Object類的equals()比較策略。

//Object類中的equals()方法源碼 public boolean equals(Object obj) {return (this == obj); }

從 Object 類的 equals() 源碼可以看到,如果編程人員沒有顯示地重寫 equals() 方法,則默認比較兩個引用是否指向同一個對象。

補充: 關于基本數據類型包裝類的比較

由于 Java 中萬物皆對象,就連基本數據類型也有其對應的包裝類,那么它們對應的比較策略是什么呢?

public static void main(String[] args) {int a = 3;Integer b = new Integer(3);System.out.println(b.equals(a)); //true, 自動裝箱 }

從上面的代碼可以看到盡管兩個引用不同, 但是輸出的結果仍為 true, 證明 Integer 包裝類重寫了 equals() 方法,追蹤其源碼:

//Integer類中的equals方法 public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false; }

從源碼看到,基本類型包裝類在重寫equals()后,比較的還是基本數據類型的值。

結束

通過探索 == 和 equals() 的區別,我們摸清楚了二者別后的比較策略,同時也對 Java 中 equals() 方法的設計進行了思考,相信大家在今后的 Java 編程實戰中不會再為相等判斷而煩惱了。

部分面試資料鏈接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA

密碼:jsam

想獲得全部面試必看資料,關注公眾號,大家可以在公眾號后臺回復“知乎”即可。

總結

以上是生活随笔為你收集整理的java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 福利视频免费观看 | 三上悠亚在线播放 | 在线伊人 | 亚洲精品aaa | av在线免费观看不卡 | 中国黄色一级视频 | 中国美女一级看片 | 国产精品视频播放 | 黄色成人小视频 | 午夜精品美女久久久久av福利 | 欧美黄页| 中文字幕在线观看视频一区二区 | 亚洲国产免费看 | 男人综合网 | 欧洲精品码一区二区三区免费看 | 亚洲精品日韩av | 噜噜噜精品欧美成人 | 91蜜桃婷婷狠狠久久综合9色 | 成人3d动漫在线观看 | 成人亚洲玉足脚交系列 | 美女自卫网站 | 中文字幕一区二区三区四区免费看 | 中文字幕在线观看视频一区二区 | 8x8ⅹ国产精品一区二区二区 | 健身教练巨大粗爽gay视频 | 久久免费大片 | 伊人久久九 | 激情六月婷 | 国产情侣激情 | 黄网址在线观看 | 99精品视频国产 | 三级少妇| 香蕉视频在线网址 | 午夜视频免费在线观看 | 特级一级黄色片 | 色妞色视频一区二区三区四区 | 少妇精品无码一区二区三区 | 在线观看va | 麻豆影视大全 | 国产免费叼嘿网站免费 | 国产在线观看 | 黄网在线观看免费 | 亚洲国产一区二区在线 | 中文字幕www | 免费网站黄色 | 操操操操操操操操操 | 丝袜综合网 | 国产一级特黄 | 另类专区亚洲 | 国产一级片 | 91亚洲精品久久久蜜桃借种 | 欧洲成人在线观看 | 国产成人三级在线 | 中文 欧美 日韩 | 日韩国产电影 | 欧美熟妇激情一区二区三区 | 韩国黄色大片 | 亚洲永久无码精品一区二区 | 国产中文字幕精品 | 国产一区二区三区免费观看视频 | 日韩精品免费在线观看 | 淫久久| 久久人人人 | 亚洲色图15p | 无套日出白浆 | 久久久久久久久久久影院 | 色网站入口 | 亚洲人成电影在线播放 | 国产精品原创 | 少妇又色又紧又大爽又刺激 | 国产精品久久久久久久久久久久久久久久久久 | 欧美在线一级视频 | 黄色精品在线观看 | 一级片视频免费看 | 麻豆日韩 | 国产在线观看免费 | 欧美一区二区不卡视频 | 国产成人精品亚洲日本在线观看 | 看黄网站在线观看 | 美乳人妻一区二区三区 | 欧美日韩人妻精品一区二区 | 日韩少妇内射免费播放18禁裸乳 | 伊人久久婷婷 | 婷婷亚洲五月色综合 | 精品少妇一区二区三区免费观看 | 一二三区免费 | 日韩精品电影 | 大尺度做爰床戏呻吟舒畅 | 亚洲中文字幕久久无码 | 欧美亚洲综合久久 | 视频在线观看网站免费 | 超碰在线综合 | 国产1区二区| 日韩av在线导航 | 午夜免费视频网站 | 伊人婷婷色 | 色臀av| 内射合集对白在线 | 色视频综合 |