AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

前言

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

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

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

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

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

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

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

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

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

1、Integer對象

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

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

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

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

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

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

Integer a = 1000;Integer b = 1000;

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

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

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

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

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

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

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

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

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

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

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

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

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

Integer a = 1000;Integer b = 1000;

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

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

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

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

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

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

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

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

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

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

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

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

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

Integer a = 1000;Integer b = 1000;

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

2、判斷相等

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

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

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

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

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

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

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

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

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

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

執行結果是:true。WKm28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

總結

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

Integer a = 1000;

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

Integer a = Integer.valueOf(1000);

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 小米MIX Fold 3配置細節曝光:搭載領先版驍龍8 Gen2+罕見5倍長焦

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 郭明錤稱華為和江淮汽車合作開發問界MPV,定價100萬左右、計劃明年量產

    8 月 1 日消息,郭明錤今天在 Medium 平臺發布博文,稱華為正在和江淮汽車合作,開發售價在 100 萬元的問界 MPV,預計在 2024 年第 2 季度量產,銷量目標為
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀?! ∶绹鴷r間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top