日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java中“100=100”為True,而"1000=1000"為False?

來源: 責編: 時間:2023-12-20 09:22:42 211觀看
導讀前言今天跟大家聊一個有趣的話題,在Java中兩個Integer對象做比較時,會產生意想不到的結果。例如:Integer a = 100;Integer b = 100;System.out.println(a==b);其運行結果是:true。而如果改成下面這樣:Integer a = 1000;Int

LLX28資訊網——每日最新資訊28at.com

前言

今天跟大家聊一個有趣的話題,在Java中兩個Integer對象做比較時,會產生意想不到的結果。LLX28資訊網——每日最新資訊28at.com

例如:LLX28資訊網——每日最新資訊28at.com

Integer a = 100;Integer b = 100;System.out.println(a==b);

其運行結果是:true。LLX28資訊網——每日最新資訊28at.com

而如果改成下面這樣:LLX28資訊網——每日最新資訊28at.com

Integer a = 1000;Integer b = 1000;System.out.println(a==b);

其運行結果是:false。LLX28資訊網——每日最新資訊28at.com

看到這里,懵了沒有?LLX28資訊網——每日最新資訊28at.com

為什么會產生這樣的結果呢?LLX28資訊網——每日最新資訊28at.com

1、Integer對象

上面例子中的a和b,是兩個Integer對象。LLX28資訊網——每日最新資訊28at.com

而非Java中的8種基本類型。LLX28資訊網——每日最新資訊28at.com

8種基本類型包括:LLX28資訊網——每日最新資訊28at.com

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

Integer其實是int的包裝類型。LLX28資訊網——每日最新資訊28at.com

在Java中,除了上面的這8種類型,其他的類型都是對象,保存的是引用,而非數(shù)據(jù)本身。LLX28資訊網——每日最新資訊28at.com

Integer a = 1000;Integer b = 1000;

可能有些人認為是下面的簡寫:LLX28資訊網——每日最新資訊28at.com

Integer a = new Integer(1000);Integer b = new Integer(1000);

這個想法表面上看起來是對的,但實際上有問題。LLX28資訊網——每日最新資訊28at.com

在JVM中的內存分布情況是下面這樣的:LLX28資訊網——每日最新資訊28at.com

LLX28資訊網——每日最新資訊28at.com

在棧中創(chuàng)建了兩個局部變量a和b,同時在堆上new了兩塊內存區(qū)域,他們存放的值都是1000。LLX28資訊網——每日最新資訊28at.com

變量a的引用指向第一個1000的地址。LLX28資訊網——每日最新資訊28at.com

而變量b的引用指向第二個1000的地址。LLX28資訊網——每日最新資訊28at.com

很顯然變量a和b的引用不相等。LLX28資訊網——每日最新資訊28at.com

既然兩個Integer對象用==號,比較的是引用是否相等,但下面的這個例子為什么又會返回true呢?LLX28資訊網——每日最新資訊28at.com

Integer a = 100;Integer b = 100;System.out.println(a==b);

不應該也返回false嗎?LLX28資訊網——每日最新資訊28at.com

對象a和b的引用不一樣。LLX28資訊網——每日最新資訊28at.com

Integer a = 1000;Integer b = 1000;

其實正確的簡寫是下面這樣的:LLX28資訊網——每日最新資訊28at.com

Integer a = Integer.valueOf(1000);Integer b = Integer.valueOf(1000);

在定義對象a和b時,Java自動調用了Integer.valueOf將數(shù)字封裝成對象。LLX28資訊網——每日最新資訊28at.com

LLX28資訊網——每日最新資訊28at.com

而如果數(shù)字在low和high之間的話,是直接從IntegerCache緩存中獲取的數(shù)據(jù)。LLX28資訊網——每日最新資訊28at.com

LLX28資訊網——每日最新資訊28at.com

Integer類的內部,將-128~127之間的數(shù)字緩存起來了。LLX28資訊網——每日最新資訊28at.com

也就是說,如果數(shù)字在-128~127,是直接從緩存中獲取的Integer對象。如果數(shù)字超過了這個范圍,則是new出來的新對象。LLX28資訊網——每日最新資訊28at.com

文章示例中的1000,超出了-128~127的范圍,所以對象a和b的引用指向了兩個不同的地址。LLX28資訊網——每日最新資訊28at.com

而示例中的100,在-128~127的范圍內,對象a和b的引用指向了同一個地址。LLX28資訊網——每日最新資訊28at.com

所以會產生文章開頭的運行結果。LLX28資訊網——每日最新資訊28at.com

為什么Integer類會加這個緩存呢?LLX28資訊網——每日最新資訊28at.com

答:-128~127是使用最頻繁的數(shù)字,如果不做緩存,會在內存中產生大量指向相同數(shù)據(jù)的對象,有點浪費內存空間。LLX28資訊網——每日最新資訊28at.com

Integer a = 1000;Integer b = 1000;

如果想要上面的對象a和b相等,我們該怎么判斷呢?LLX28資訊網——每日最新資訊28at.com

2、判斷相等

在Java中,如果使用==號比較兩個對象是否相等,比如:a==b,其實比較的是兩個對象的引用是否相等。LLX28資訊網——每日最新資訊28at.com

很顯然變量a和b的引用,指向的是兩個不同的地址,引用肯定是不相等的。LLX28資訊網——每日最新資訊28at.com

因此下面的執(zhí)行結果是:false。LLX28資訊網——每日最新資訊28at.com

Integer a =  Integer.valueOf(1000);Integer b = Integer.valueOf(1000);System.out.println(a==b);

由于1000在Integer緩存的范圍之外,因此上面的代碼最終會變成這樣:LLX28資訊網——每日最新資訊28at.com

Integer a =  new Integer(1000);Integer b = new Integer(1000);System.out.println(a==b);

如果想要a和b比較時返回true,該怎么辦呢?LLX28資訊網——每日最新資訊28at.com

答:調用equals方法。LLX28資訊網——每日最新資訊28at.com

代碼改成這樣的:LLX28資訊網——每日最新資訊28at.com

Integer a = Integer.valueOf(1000);Integer b = Integer.valueOf(1000);System.out.println(a.equals(b));

執(zhí)行結果是:true。LLX28資訊網——每日最新資訊28at.com

其實equals方法是Object類的方法,所有對象都有這個方法。LLX28資訊網——每日最新資訊28at.com

LLX28資訊網——每日最新資訊28at.com

它的底層也是用的==號判斷兩個Object類型的對象是否相等。LLX28資訊網——每日最新資訊28at.com

不過Integer類對該方法進行了重寫:LLX28資訊網——每日最新資訊28at.com

LLX28資訊網——每日最新資訊28at.com

它的底層會先調用Integer類的intValue方法獲取int類型的數(shù)據(jù),然后再通過==號進行比較。LLX28資訊網——每日最新資訊28at.com

此時,比較的不是兩個對象的引用是否相等,而且比較的具體的數(shù)據(jù)是否相等。LLX28資訊網——每日最新資訊28at.com

我們使用equals方法,可以判斷兩個Integer對象的值是否相等,而不是判斷引用是否相等。LLX28資訊網——每日最新資訊28at.com

總結

Integer類中有緩存,范圍是:-128~127。LLX28資訊網——每日最新資訊28at.com

Integer a = 1000;

其實默認調用了Integer.valueOf方法,將數(shù)字轉換成Integer類型:LLX28資訊網——每日最新資訊28at.com

Integer a = Integer.valueOf(1000);

如果數(shù)字在-128~127之間,則直接從緩存中獲取Integer對象。LLX28資訊網——每日最新資訊28at.com

如果數(shù)字在-128~127之外,則該方法會new一個新的Integer對象。LLX28資訊網——每日最新資訊28at.com

我們在判斷兩個對象是否相等時,一定要多注意:LLX28資訊網——每日最新資訊28at.com

  1. 判斷兩個對象的引用是否相等,用==號判斷。
  2. 判斷兩個對象的值是否相等,調用equals方法判斷。

本文鏈接:http://www.www897cc.com/showinfo-26-50024-0.htmlJava中“100=100”為True,而"1000=1000"為False?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 什么是NIO?你知道嗎?

下一篇: 探索Zabbix API(三):導出主機組資源使用率

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監(jiān)劉新翠在WOT2023大會上的主題分享,更多精彩內容及現(xiàn)場PPT,請關注51CTO技術棧公眾號,發(fā)消息【WOT2023PPT】即可直接領取
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式。可以為擁有指定屬性的 HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網聯(lián)合創(chuàng)
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的“新電商三兄弟”成為業(yè)內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
Top 主站蜘蛛池模板: 平乐县| 额尔古纳市| 张家界市| 福贡县| 连山| 五原县| 乌海市| 五莲县| 泰宁县| 奉化市| 阿克陶县| 义乌市| 星子县| 奎屯市| 丰城市| 河曲县| 陆川县| 义乌市| 金华市| 聂荣县| 美姑县| 庄河市| 安溪县| 南陵县| 康定县| 青河县| 寻甸| 东城区| 吉林省| 祁门县| 广宗县| 江华| 库伦旗| 越西县| 沾化县| 新巴尔虎右旗| 韶山市| 东至县| 龙川县| 平泉县| 垫江县|