自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java中“100=100”為T(mén)rue,而"1000=1000"為False?

開(kāi)發(fā) 前端
今天跟大家聊一個(gè)有趣的話題,在Java中兩個(gè)Integer對(duì)象做比較時(shí),會(huì)產(chǎn)生意想不到的結(jié)果。

前言

今天跟大家聊一個(gè)有趣的話題,在Java中兩個(gè)Integer對(duì)象做比較時(shí),會(huì)產(chǎn)生意想不到的結(jié)果。

例如:

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

其運(yùn)行結(jié)果是:true。

而如果改成下面這樣:

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

其運(yùn)行結(jié)果是:false。

看到這里,懵了沒(méi)有?

為什么會(huì)產(chǎn)生這樣的結(jié)果呢?

1、Integer對(duì)象

上面例子中的a和b,是兩個(gè)Integer對(duì)象。

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

8種基本類型包括:

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

Integer其實(shí)是int的包裝類型。

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

Integer a = 1000;
Integer b = 1000;

可能有些人認(rèn)為是下面的簡(jiǎn)寫(xiě):

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

這個(gè)想法表面上看起來(lái)是對(duì)的,但實(shí)際上有問(wèn)題。

在JVM中的內(nèi)存分布情況是下面這樣的:

在棧中創(chuàng)建了兩個(gè)局部變量a和b,同時(shí)在堆上new了兩塊內(nèi)存區(qū)域,他們存放的值都是1000。

變量a的引用指向第一個(gè)1000的地址。

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

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

既然兩個(gè)Integer對(duì)象用==號(hào),比較的是引用是否相等,但下面的這個(gè)例子為什么又會(huì)返回true呢?

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

不應(yīng)該也返回false嗎?

對(duì)象a和b的引用不一樣。

Integer a = 1000;
Integer b = 1000;

其實(shí)正確的簡(jiǎn)寫(xiě)是下面這樣的:

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

在定義對(duì)象a和b時(shí),Java自動(dòng)調(diào)用了Integer.valueOf將數(shù)字封裝成對(duì)象。

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

Integer類的內(nèi)部,將-128~127之間的數(shù)字緩存起來(lái)了。

也就是說(shuō),如果數(shù)字在-128~127,是直接從緩存中獲取的Integer對(duì)象。如果數(shù)字超過(guò)了這個(gè)范圍,則是new出來(lái)的新對(duì)象。

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

而示例中的100,在-128~127的范圍內(nèi),對(duì)象a和b的引用指向了同一個(gè)地址。

所以會(huì)產(chǎn)生文章開(kāi)頭的運(yùn)行結(jié)果。

為什么Integer類會(huì)加這個(gè)緩存呢?

答:-128~127是使用最頻繁的數(shù)字,如果不做緩存,會(huì)在內(nèi)存中產(chǎn)生大量指向相同數(shù)據(jù)的對(duì)象,有點(diǎn)浪費(fèi)內(nèi)存空間。

Integer a = 1000;
Integer b = 1000;

如果想要上面的對(duì)象a和b相等,我們?cè)撛趺磁袛嗄兀?/p>

2、判斷相等

在Java中,如果使用==號(hào)比較兩個(gè)對(duì)象是否相等,比如:a==b,其實(shí)比較的是兩個(gè)對(duì)象的引用是否相等。

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

因此下面的執(zhí)行結(jié)果是:false。

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

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

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

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

答:調(diào)用equals方法。

代碼改成這樣的:

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

執(zhí)行結(jié)果是:true。

其實(shí)equals方法是Object類的方法,所有對(duì)象都有這個(gè)方法。

它的底層也是用的==號(hào)判斷兩個(gè)Object類型的對(duì)象是否相等。

不過(guò)Integer類對(duì)該方法進(jìn)行了重寫(xiě):

它的底層會(huì)先調(diào)用Integer類的intValue方法獲取int類型的數(shù)據(jù),然后再通過(guò)==號(hào)進(jìn)行比較。

此時(shí),比較的不是兩個(gè)對(duì)象的引用是否相等,而且比較的具體的數(shù)據(jù)是否相等。

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

總結(jié)

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

Integer a = 1000;

其實(shí)默認(rèn)調(diào)用了Integer.valueOf方法,將數(shù)字轉(zhuǎn)換成Integer類型:

Integer a = Integer.valueOf(1000);

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

如果數(shù)字在-128~127之外,則該方法會(huì)new一個(gè)新的Integer對(duì)象。

我們?cè)谂袛鄡蓚€(gè)對(duì)象是否相等時(shí),一定要多注意:

  1. 判斷兩個(gè)對(duì)象的引用是否相等,用==號(hào)判斷。
  2. 判斷兩個(gè)對(duì)象的值是否相等,調(diào)用equals方法判斷。
責(zé)任編輯:姜華 來(lái)源: 蘇三說(shuō)技術(shù)
相關(guān)推薦

2015-11-23 10:09:30

Java

2021-04-26 14:00:43

Java 數(shù)據(jù)類型

2023-05-10 16:15:58

javaScript算法開(kāi)發(fā)

2016-12-22 18:38:49

JavaAndroid

2019-05-17 11:15:50

芯片數(shù)據(jù)中心技術(shù)

2020-10-28 18:51:12

大屏

2015-11-04 10:32:15

京東雙11

2012-12-25 09:30:14

MIUI小米

2009-06-09 08:54:17

2009-09-18 08:52:42

Windows Mob開(kāi)發(fā)團(tuán)隊(duì)

2021-02-02 20:45:03

Pythonmath False

2012-07-05 09:59:54

2009-11-03 18:26:52

2012-07-11 11:05:38

Wi-Fi倫敦奧運(yùn)會(huì)英國(guó)電信

2017-10-12 11:23:51

阿里云1000萬(wàn)企業(yè)

2021-07-18 07:36:36

網(wǎng)絡(luò)攻擊惡意軟件網(wǎng)絡(luò)安全

2010-12-28 09:57:11

SymbianQtMeeGo

2019-09-20 09:35:15

百度

2022-05-26 15:00:36

翻譯模型谷歌

2011-04-20 14:28:27

軟件平臺(tái)SOA平臺(tái)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)