面試常考題---128陷阱(詳細)

?1.問題引入

分別引入了int和Integer變量,并進行比較

int b = 128;
int b1 = 128;Integer d = 127;
Integer d1 = 127;Integer e = 128;
Integer e1 = 128;System.out.println(b==b1);
System.out.println(d==d1);
System.out.println(e==e1);
System.out.println(e.equals(e1));

其輸出結果如下

我們可以看到以下三個問題

(1)當數據為int類型的時候,運行的結果為true,

(2)如果是封裝類型Integer的時候,數據為127的時候結果為true,但是到了128及以上就變成了false(128陷阱

(3)使用equals時,同樣的數據運行結果卻為true

為什么會這樣呢?

2.==和equals

基本類型的數據的變量名和值都存在棧中(作為類的屬性的情況除外

==:

對于基本數據類型,比較的是棧中數據是否相同,只要數據沒有改變,其運行都會為true;

對于引用數據類型,則比較的是所指向對象的地址值是否相等

equals:

如果沒有對 equals 方法進行重寫,則相當于“==”,比較的是引用類型的變
所指向的對象的地址值重寫了,比較的是對象的

通過如上解釋就可以說明(1)、(3)問題了。

3.128陷阱原因

(1)什么是128陷阱

Integer 數據類型使用“==”比較時,如果對象值的范圍超出-128--127,那么兩個對象值相同的情況下,返回的結果是false。

(2)尋找原因

當Integer? a =?xxx時,其底層會自動轉換成為Integer a = Integer.valueOf(xxx)

所以讓我們一起看看 Integer的 valueOf 方法的源碼:

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

?通過以上代碼,我們可以看到valueOf存在范圍,在范圍內會返回cache數組,超過了就會重新new一個新的內存空間

?原因總結:Integer的ValueOf0方法當中,如果數值在最小值和最大值(-128~127)之間的數據都存儲在一個cache數組中,該數組相當于一個緩存,當我們在該范圍之間進行自動裝箱的時候,程序就直接返回該值在數組中的內存地址(cache數組的地址),所以在-128~127之間的數值用==進行比較是相等,而不在這個區間的數,需要新開辟—個內存空間,所以不相等。

(3)陷阱范圍

通過查看Integer源碼,我們可以看到其范圍是可以修改的,可自行嘗試

    private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43127.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

刷題(day01)

1、leetcode485.最大連續1的個數 給定一個二進制數組 nums &#xff0c; 計算其中最大連續 1 的個數。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,0,1,1,1] 輸出&#xff1a;3 解釋&#xff1a;開頭的兩位和最后的三位都是連續 1 &#xff0c;所以最大連續 1 的個數是 3.…

Nginx 高效加速策略:動靜分離與緩存詳解

在現代Web開發中&#xff0c;網站性能是衡量用戶體驗的關鍵指標之一。Nginx&#xff0c;以其出色的性能和靈活性&#xff0c;成為眾多網站架構中不可或缺的一部分。本文將深度解析如何利用Nginx實現動靜分離與緩存&#xff0c;從而大幅提升網站加載速度和響應效率。 理解動靜分…

昇思第18天打卡|ShuffleNet圖像分類

ShuffleNet網絡介紹 ShuffleNetV1是曠視科技提出的一種計算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一樣主要應用在移動端&#xff0c;所以模型的設計目標就是利用有限的計算資源來達到最好的模型精度。ShuffleNetV1的設計核心是引入了兩種操作&#xff1a;Pointw…

張大哥筆記:你一旦開竅,就會發現遍地都是錢

大家有沒有發現&#xff0c;窮人總是追逐眼前的利益&#xff0c;總是在追著錢跑&#xff0c;卻總是賺不到錢。而富人有著長遠的見識&#xff0c;追著問題跑&#xff0c;最后卻賺的盆滿缽滿。 我們聽過這樣一句話&#xff0c;錢不是賺來的&#xff0c;而是幫助別人解決問題后給你…

【計算機】同步/異步

同步/異步 在計算機科學和編程中&#xff0c;“同步”&#xff08;Synchronization&#xff09;是一種機制&#xff0c;用于協調不同進程或線程之間的操作&#xff0c;以避免競態條件&#xff08;race conditions&#xff09;、死鎖&#xff08;deadlocks&#xff09;和其他并…

Qt/C++編寫地圖應用/離線地圖下載/路徑規劃/軌跡回放/海量點/坐標轉換

一、前言說明 這個地圖組件寫了很多年了&#xff0c;最初設計的比較粗糙&#xff0c;最開始只是為了滿足項目需要&#xff0c;并沒有考慮太多拓展性&#xff0c;比如最初都是按照百度地圖寫死在代碼中&#xff0c;經過這幾年大量的現場實際應用&#xff0c;以及大量的用戶提出…

Django 新增數據 save()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

BFC 是什么?

BFC 是塊級格式化上下文&#xff08;Block Formatting Context&#xff09;的縮寫&#xff0c;是 CSS 中一個重要的概念&#xff0c;用于控制塊級盒子的布局及浮動元素的交互。BFC 是一個獨立的渲染區域&#xff0c;內部的塊級盒子會按照特定的規則進行布局&#xff0c;不會影響…

軟件工程(上)

目錄 軟件過程模型&#xff08;軟件開發模型&#xff09; 瀑布模型 原型模型 V模型 構件組裝模型 螺旋模型&#xff08;原型瀑布&#xff09; 基于構件的軟件工程&#xff08;CBSE&#xff09; 快速應用開發模型&#xff08;RAD&#xff09; 統一過程&#xff08;UP&a…

Linux學習看這一篇就夠了,超超超牛的Linux基礎入門

引言 小伙伴們&#xff0c;不管是學習c還是學習其他語言在我們學的路上都繞不過操作系統&#xff0c;而且&#xff0c;老生常談的Linux更是每個計算機人的必修&#xff0c;那么我們對Linux的了解可能只是從別人那聽到的簡單的這個系統很牛&#xff0c;巴拉巴拉的&#xff0c;但…

大模型日報 2024-07-08

大模型日報 2024-07-08 大模型資訊 Anthropic CEO&#xff1a;大模型訓練成本暴漲&#xff0c;2027年將達1000億美元&#xff01; Anthropic首席執行官表示&#xff0c;當前AI模型訓練成本是10億美元&#xff0c;未來三年&#xff0c;這個數字可能會上升到100億美元甚至1000億美…

GitLab管理員常用配置及設置匯總

? 之前在 虛擬機Ubuntu 22.04上搭建GitLab操作步驟 上介紹了在Ubuntu 22.04上如何搭建社區版的GitLab&#xff0c;這里整理下作為GitLab管理員時在搭建完GitLab CE后&#xff0c;如何對其進行配置或設置 更改倉庫存儲位置&#xff1a;切換到root用戶下操作 默認存放位置&…

SSL 證書

自動獲取 Lets Encrypt 免費證書 &#xff08;適用于 Linux 系統&#xff09; 安裝 Certbot sudo apt-get update sudo apt-get install certbot python3-certbot-nginx # Nginx 服務器 sudo apt-get install certbot python3-certbot-apache # Apache 服務器 獲取和安裝證…

小米rdemi紅米ax3000t刷機 20240707最新配套完整程序整理合集

小米rdemi紅米ax3000t刷機程序地址&#xff1a; https://www.123pan.com/s/LA1bVv-EOzVv.html 小米路由器SSH密碼計算器 https://www.1234f.com/fuwu/ax3000t/ 最新更新地址&#xff1a;https://www.1234f.com/fuwu/openwrt/ 依次輸入如下命令&#xff1a; curl -X POST h…

Leetcode 295.數據流的中位數

295.數據流的中位數 問題描述 中位數是有序整數列表中的中間值。如果列表的大小是偶數&#xff0c;則沒有中間值&#xff0c;中位數是兩個中間值的平均值。 例如 arr [2,3,4] 的中位數是 3 。例如 arr [2,3] 的中位數是 (2 3) / 2 2.5 。 實現 MedianFinder 類: Media…

算法013:水果成籃

水果成籃. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 這道題題目很長&#xff0c;仔細閱讀過后&#xff0c;我們其實可以簡化成&#xff…

MySQL 9.0新特性:向量存儲

MySQL 9.0 正式版已經發布&#xff0c;其中一個亮點就是向量&#xff08;VECTOR&#xff09;數據類型的支持&#xff0c;本文給大家詳細介紹一下這個新功能。 向量類型 MySQL 9.0 增加了一個新的向量數據類型&#xff1a;VECTOR。它是一種可以存儲 N 個數據項的數據結構&…

Redis Stream:實時數據流的處理與存儲

Redis Stream:實時數據流的處理與存儲 引言 在當今數據驅動的世界中,實時數據處理和存儲成為了許多應用的核心需求。Redis Stream作為一種新興的數據結構,為Redis帶來了強大的流處理能力。本文將深入探討Redis Stream的特點、使用場景以及如何高效地利用它來處理實時數據流…

聚焦數字創新,定義影像未來

國際數字影像產業園在明確產業定位與發展方向時&#xff0c;應聚焦于數字影像、文創、媒體等新興產業領域&#xff0c;以技術創新為核心動力、產業升級為保障、市場拓展為途徑、國際化發展為方向&#xff0c;推動園區的持續健康發展。 作為園區的核心產業&#xff0c;數字影像產…