基于Integer值判斷是否相等的問題
面試中經(jīng)常遇到一個問題:
Integer a = 10; Integer b = 10; System.out.println(a == b); a = 1000; b = 1000; System.out.println(a == b);
兩個打印值分別是多少?
詳解:true;false;
默認IntegerCache.low 是-128,Integer.high是127,如果在這個區(qū)間內(nèi),他就會把變量i當(dāng)做一個變量,放到內(nèi)存中;但如果不在這個范圍內(nèi),就會去new一個Integer對象,在這個題目中,10在范圍內(nèi),所以直接比較其值;1000不在范圍內(nèi),所以jdk幫我new了兩個實例,這樣在用==,肯定是false。
補充:Integer值判斷是否相等問題 要用equals判斷不要用“==”判斷
昨天在開發(fā)中遇到一個問題,定義了兩個Integer變量,暫且定義為Integer a; Integer b;
這兩個值由前端賦值并傳到后臺,前臺傳的是a = 12345, b = 12345, 但我在后臺比較的時候 if (a == b),卻返回false,好無語啊,不都是123嗎?為什么返回false,后來改為equals(),返回true,但其中的有些端倪還不太清楚,現(xiàn)總結(jié)下:
我們知道Integer是int的包裝類,在jdk1.5以上,可以實現(xiàn)自動裝箱拆箱,就是jdk里面會自動幫我們轉(zhuǎn)換,不需要我們手動去強轉(zhuǎn),所以我們經(jīng)常在這兩種類型中隨意寫,平時也沒什么注意
但Integer他是對象,我們知道 == 比較的是堆中的地址,但有個奇怪的事是, 如果 Integer a = 123, Integer b = 123,可以返回true,但如果Integer a = 12345, Integer b = 12345,返回false,這就是jdk的東西,我們看下Integer的源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
默認IntegerCache.low 是-127,Integer.high是128,如果在這個區(qū)間內(nèi),他就會把變量i當(dāng)做一個變量,放到內(nèi)存中;但如果不在這個范圍內(nèi),就會去new一個Integer對象,
而我在代碼中,兩個Integer值都不在這個范圍內(nèi),所以jdk幫我new了兩個實例,這樣在用==,肯定是false。
所以如果要比較Integer的值,比較靠譜的是通過Integer.intValue();這樣出來的就是int值,就可以直接比較了;或者equals()比較
Integer的底層 equals是這樣定義的 先拆箱為int再來比較
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
一文帶你搞懂Java中Synchronized和Lock的原理與使用
這篇文章主要為大家詳細介紹了Java中Synchronized和Lock的原理與使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2023-04-04
Java并發(fā)之synchronized實現(xiàn)原理深入理解
這篇文章主要介紹了Java中synchronized實現(xiàn)原理詳解,涉及synchronized實現(xiàn)同步的基礎(chǔ),Java對象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下2021-08-08
Spring Boot 2.4配置特定環(huán)境時spring: profiles提示被棄用的原
這篇文章主要介紹了Spring Boot 2.4配置特定環(huán)境時spring: profiles提示被棄用的原因,本文給大家分享詳細解決方案,需要的朋友可以參考下2023-04-04
RocketMQ特性Broker存儲事務(wù)消息實現(xiàn)
這篇文章主要為大家介紹了RocketMQ特性Broker存儲事務(wù)消息實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Spring Boot集成Spring Cloud Security進行安全增強的方法
Spring Cloud Security是Spring Security的擴展,它提供了對Spring Cloud體系中的服務(wù)認證和授權(quán)的支持,包括OAuth2、JWT等,這篇文章主要介紹了Spring Boot集成Spring Cloud Security進行安全增強,需要的朋友可以參考下2024-11-11

