成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
今天跟大家聊一個有趣的話題,在Java中兩個Integer對象做比較時,會產生意想不到的結果。

前言

今天跟大家聊一個有趣的話題,在Java中兩個Integer對象做比較時,會產生意想不到的結果。

例如:

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

其運行結果是:true。

而如果改成下面這樣:

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

其運行結果是:false。

看到這里,懵了沒有?

為什么會產生這樣的結果呢?

1、Integer對象

上面例子中的a和b,是兩個Integer對象。

而非Java中的8種基本類型。

8種基本類型包括:

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

Integer其實是int的包裝類型。

在Java中,除了上面的這8種類型,其他的類型都是對象,保存的是引用,而非數據本身。

Integer a = 1000;
Integer b = 1000;

可能有些人認為是下面的簡寫:

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

這個想法表面上看起來是對的,但實際上有問題。

在JVM中的內存分布情況是下面這樣的:

在棧中創建了兩個局部變量a和b,同時在堆上new了兩塊內存區域,他們存放的值都是1000。

變量a的引用指向第一個1000的地址。

而變量b的引用指向第二個1000的地址。

很顯然變量a和b的引用不相等。

既然兩個Integer對象用==號,比較的是引用是否相等,但下面的這個例子為什么又會返回true呢?

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

不應該也返回false嗎?

對象a和b的引用不一樣。

Integer a = 1000;
Integer b = 1000;

其實正確的簡寫是下面這樣的:

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

在定義對象a和b時,Java自動調用了Integer.valueOf將數字封裝成對象。

而如果數字在low和high之間的話,是直接從IntegerCache緩存中獲取的數據。

Integer類的內部,將-128~127之間的數字緩存起來了。

也就是說,如果數字在-128~127,是直接從緩存中獲取的Integer對象。如果數字超過了這個范圍,則是new出來的新對象。

文章示例中的1000,超出了-128~127的范圍,所以對象a和b的引用指向了兩個不同的地址。

而示例中的100,在-128~127的范圍內,對象a和b的引用指向了同一個地址。

所以會產生文章開頭的運行結果。

為什么Integer類會加這個緩存呢?

答:-128~127是使用最頻繁的數字,如果不做緩存,會在內存中產生大量指向相同數據的對象,有點浪費內存空間。

Integer a = 1000;
Integer b = 1000;

如果想要上面的對象a和b相等,我們該怎么判斷呢?

2、判斷相等

在Java中,如果使用==號比較兩個對象是否相等,比如:a==b,其實比較的是兩個對象的引用是否相等。

很顯然變量a和b的引用,指向的是兩個不同的地址,引用肯定是不相等的。

因此下面的執行結果是:false。

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

由于1000在Integer緩存的范圍之外,因此上面的代碼最終會變成這樣:

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

如果想要a和b比較時返回true,該怎么辦呢?

答:調用equals方法。

代碼改成這樣的:

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

執行結果是:true。

其實equals方法是Object類的方法,所有對象都有這個方法。

它的底層也是用的==號判斷兩個Object類型的對象是否相等。

不過Integer類對該方法進行了重寫:

它的底層會先調用Integer類的intValue方法獲取int類型的數據,然后再通過==號進行比較。

此時,比較的不是兩個對象的引用是否相等,而且比較的具體的數據是否相等。

我們使用equals方法,可以判斷兩個Integer對象的值是否相等,而不是判斷引用是否相等。

總結

Integer類中有緩存,范圍是:-128~127。

Integer a = 1000;

其實默認調用了Integer.valueOf方法,將數字轉換成Integer類型:

Integer a = Integer.valueOf(1000);

如果數字在-128~127之間,則直接從緩存中獲取Integer對象。

如果數字在-128~127之外,則該方法會new一個新的Integer對象。

我們在判斷兩個對象是否相等時,一定要多注意:

  1. 判斷兩個對象的引用是否相等,用==號判斷。
  2. 判斷兩個對象的值是否相等,調用equals方法判斷。
責任編輯:姜華 來源: 蘇三說技術
相關推薦

2015-11-23 10:09:30

Java

2021-04-26 14:00:43

Java 數據類型

2023-05-10 16:15:58

javaScript算法開發

2016-12-22 18:38:49

JavaAndroid

2019-05-17 11:15:50

芯片數據中心技術

2020-10-28 18:51:12

大屏

2012-12-25 09:30:14

MIUI小米

2015-11-04 10:32:15

京東雙11

2009-09-18 08:52:42

Windows Mob開發團隊

2009-06-09 08:54:17

2025-05-30 08:40:00

英偉達芯片AI

2021-02-02 20:45:03

Pythonmath False

2012-07-11 11:05:38

Wi-Fi倫敦奧運會英國電信

2012-07-05 09:59:54

2009-11-03 18:26:52

2010-12-28 09:57:11

SymbianQtMeeGo

2011-04-20 14:28:27

軟件平臺SOA平臺化

2017-10-12 11:23:51

阿里云1000萬企業

2021-07-18 07:36:36

網絡攻擊惡意軟件網絡安全

2019-09-20 09:35:15

百度
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品欧美久久久久久久 | 欧美一区二区三区在线 | 欧美视频在线看 | 成年人在线电影 | 欧美一级网站 | 91av视频在线播放 | 亚洲狠狠爱| 国产精品欧美一区二区 | av播播| 1级毛片 | 国产成人综合亚洲欧美94在线 | 中文字幕乱码视频32 | 国产日韩一区二区三免费 | 亚洲欧美aⅴ | 久久国内精品 | 亚洲欧美在线观看 | 久草网在线视频 | 伊人春色在线观看 | 一级黄色av电影 | 亚洲国产欧美一区二区三区久久 | 亚洲精品1区 | 国产精品久久久久久久久污网站 | 久久久久国产精品www | 九九热免费看 | 伊人久久精品一区二区三区 | 男人天堂视频在线观看 | 国产精品一区二区久久 | 亚洲国产片 | 91成人在线 | 在线观看国产视频 | 国产欧美精品一区二区三区 | 国产精品久久久久久婷婷天堂 | 亚洲精品一区二区 | 欧美色综合天天久久综合精品 | 久草视频观看 | 麻豆av一区二区三区久久 | 九九热这里 | 国产精品高潮呻吟久久av野狼 | 国产精品国产自产拍高清 | 凹凸日日摸日日碰夜夜 | 日本不卡免费新一二三区 |