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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Integer判断相等,到底该用==还是equals

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Integer判断相等,到底该用==还是equals 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

這幾天,被幾道java基礎練習題中的==和equals給繞暈了,所以打算把關于這塊的內容好好總結下,爭取下次再遇到類似的題目,自己不會再出錯,恩,就是這樣。

簡單了解

在Object類中,equals方法的定義是這樣的,

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

這塊就有點懵了,這不還是用==來進行比較的嗎?再往下搜了才知道,在大部分的封裝類中,都重寫了Object類的這個方法,所以兩者還是會有區別的。總的來說,==是一個關系運算符,如果比較的兩端都為基本類型,則判斷兩者的值是否相等,(判斷過程中還有不同基本類型的轉化,這里不做討論),如果比較的兩端都為引用類型的話,則比較兩者所指向對象的地址是否相同;對于equals方法,首先,能調用這個方法肯定是一個對象,然后,如果這個對象所在的類重寫了equals方法,則按照重寫的方法進行比較,如果沒有,則比較兩者所指向對象的地址是否相同。

自己動手

了解了上面那么多內容之后,然后自己就寫了一個小小的測試程序,打算驗證下,代碼如下:

public class Test{public static void main(String[] args) {Integer a = new Integer(200);Integer b = new Integer(200);Integer c = 200;Integer e = 200;int d = 200;System.out.println("兩個new出來的對象 ==判斷"+(a==b));System.out.println("兩個new出來的對象 equal判斷"+a.equals(b));System.out.println("new出的對象和用int賦值的Integer ==判斷"+(a==c));System.out.println("new出的對象和用int賦值的Integer equal判斷"+(a.equals(c)));System.out.println("兩個用int賦值的Integer ==判斷"+(c==e));System.out.println("兩個用int賦值的Integer equal判斷"+(c.equals(e)));System.out.println("基本類型和new出的對象 ==判斷"+(d==a));System.out.println("基本類型和new出的對象 equal判斷"+(a.equals(d)));System.out.println("基本類型和自動裝箱的對象 ==判斷"+(d==c));System.out.println("基本類型和自動裝箱的對象 equal判斷"+(c.equals(d)));} }

執行的結果如下

兩個new出來的對象 ==判斷false 兩個new出來的對象 equal判斷true new出的對象和用int賦值的Integer ==判斷false new出的對象和用int賦值的Integer equal判斷true 兩個用int賦值的Integer ==判斷false 兩個用int賦值的Integer equal判斷true 基本類型和new出的對象 ==判斷true 基本類型和new出的對象 equal判斷true 基本類型和自動裝箱的對象 ==判斷true 基本類型和自動裝箱的對象 equal判斷true

首先,第9行中,對于兩個new出來的Integer對象,用==比較兩者,得到了false,這點應該挺好理解的,每次使用new關鍵字,都會在堆內存中申請一塊空間,存放相應的對象的值,然后在棧中存放這塊內存的引用。而==運算符比較兩者所指向對象的地址是否相同,申請了兩塊空間,地址肯定不相同,所以結果為false。
第10行中,結果為true,查了下java的源碼,發現Integer重寫的equals方法是這樣的:

public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false; }

又調用了一個intValue方法,它的實現是這樣的:

public int intValue() { return value; }

首先判斷傳進來的Object類型是不是Integer類的一個實例,如果不是直接返回false;如果是則判斷兩者的成員變量value值是不是相等的(Integer類中定義的private final int value),這塊又回到了基本類型的比較。value的值在創建這個對象的時候被賦值,兩個Integer對象傳遞的參數都為200,所以value值相等,返回true。
看第11行前,先看下第5行。第5行中,用int給Integer賦值的那條語句,從jdk1.5開始能這么做了,因為從這個版本開始,java引入了自動裝箱、自動拆箱機制。第5行就是一個自動裝箱的過程,相當于:
Integer c = Integer.valueOf(200);
在Integer類中,valueOf方法是這么實現的:

public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }

上面這段代碼首先規定了一個范圍,默認是-128-127之間,如果參數中的i在這個范圍之內,則返回一個數組中的內容,如果不在這個范圍,則new一個新的Integer對象并返回。查看Integer類的源碼可以發現,這個數組里面緩存了基本類型-128-127之間的Integer對象。但是由于第11行是與一個new出來的對象做比較,所以==肯定返回的false。
第12行,equals方法比較兩個對象的value值,所以為true。
第13行,兩個自動裝箱的變量,但是裝箱傳遞的值大于127,所以返回false。這這塊又試了下在-128到127之間的數,結果為true,大家可以試下。
第14行,結果為true。兩個自動裝箱的Integer對象,比較value。
第15行,這塊進行比較的時候,會對Integer對象進行自動拆箱,也就是調用intValue方法,方法如上。兩個基本數據類型進行==判斷,根據值比較,所以結果為true。這塊可能有人會問,為什么不是對int類型進行自動裝箱處理呢?其實這塊是java根據一個很明顯的道理進行設計的:如果有人比較一個int類型的值和Integer類型的值,是想比較什么呢?肯定是值呀,所以這塊是對Integer對象進行拆箱而不是對int類型裝箱了。
第16行這塊,首先調用equals方法的肯定是Integer對象,但是Integer類中重寫的equals方法參數是一個Object類型呀,怎么能傳遞一個基本數據類型進去呢?所以,這塊又是一個自動裝箱的表現,當傳遞一個int類型給equals這個方法時,java會自動將這個值打包裝箱為Integer類,而Integer類的最終父類又是Object,所以這塊參數的問題就解決了,然后就是兩個Integer對象進行equals判斷,返回true。
第17行,首先d為一個基本類型int,c為一個Integer對象,所以進行==比較的時候,肯定會對Integer對象進行拆箱處理,所以結果為true。
第18行,同第16行。

總結

“==比較地址,equals比較值”這個還是挺靠譜的。但是對于包裝類和基本類型,還要涉及它們的自動裝箱、自動拆箱,所以小心一點還是比較好的,不要走到別人挖的陷阱中。



作者:bu_想
鏈接:https://www.jianshu.com/p/9cb9c61b0986
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

總結

以上是生活随笔為你收集整理的Integer判断相等,到底该用==还是equals的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 少妇高潮毛片色欲ava片 | av天堂一区 | 欧美精品日韩在线 | 成人黄色一级片 | 嫩草影院一区二区三区 | 欧美一本 | 日韩一级影视 | 日本性高潮视频 | 亚洲欧美偷拍一区 | 天天摸夜夜添狠狠添婷婷 | 欧美精品偷拍 | 日韩欧美中文字幕在线视频 | 欧美巨鞭大战丰满少妇 | 极品色av| 99在线观看免费 | 中文字幕在线播放av | 伊人9| 黄色在线免费网站 | 性自由色xxxx免费视频 | 欧美乱妇狂野欧美在线视频 | 麻豆视屏| 在线视频精品一区 | 和黑帮大佬的365 | 伊人222成人综合网 亚洲日本中文 | 91在线视频在线观看 | 国产对白视频 | 久久波多野结衣 | 四虎亚洲精品 | 玖玖zyz| 日本v视频 | 欧美精品久久久久久久自慰 | 色综合网址 | 国产一区二区三区乱码 | 操模特| 99爱在线视频 | 在线观看视频一区 | 理论视频在线观看 | 欧美亚洲一区二区在线观看 | 精品久久久久久久久久久久久久久久久 | 韩国中文字幕在线观看 | 综合激情四射 | 九七电影院97理论片 | 婷婷五月小说 | 狠狠久久久 | 青青草97国产精品免费观看 | 91丝袜呻吟高潮美腿白嫩在线观看 | 成人国产免费视频 | 一区视频免费观看 | 久久精品国产精品亚洲色婷婷 | 日韩一级片 | 欧美日本一区二区三区 | 日韩激情影院 | 欧美少妇xx | 色老汉av一区二区三区 | 香蕉黄色片 | 午夜日韩在线观看 | 成人精品一区二区三区电影黑人 | 国产精品美女自拍视频 | 最新版天堂资源在线 | av大全免费 | 雷电将军和丘丘人繁衍后代视频 | 日日草天天干 | 日本在线三级 | 美女网站在线免费观看 | 老子午夜影院 | 香蕉色网 | 动漫av一区二区三区 | 婷婷另类小说 | 欧美日韩 一区二区三区 | 女人扒开腿免费视频app | 国产免费二区 | 不卡黄色 | 国产色频 | 玖玖在线播放 | 国产免费一区二区三区在线观看 | 亚洲免费黄网 | 婷婷激情丁香 | 欧美bbbbb | 午夜久久电影 | 国产精品久久在线观看 | 2020国产精品视频 | 精品国产九九 | 毛片一区二区三区 | 日韩视频在线观看一区二区三区 | 国产精品第一区 | 欧美草草 | 俺去射| 伊人久久爱 | 国产高清黄色 | 日本成人三级电影 | 手机看片福利永久 | 在线观看视频免费 | 婷婷丁香综合 | 国产精品亚洲成在人线 | 97干干 | 黑人玩弄人妻一区二区三区四 | 欧美人在线 | 亚洲精品中文字幕在线 | 一个色av |