1. 程式人生 > >Java進階 三十四 Integer與int的種種比較你知道多少

Java進階 三十四 Integer與int的種種比較你知道多少

包裝 之間 www. tex -128 function detail content aqi

Java進階(三十四)Integer與int的種種比較你知道多少?

前言

如果面試官問Integer與int的區別:估計大多數人只會說到兩點:Ingeter是int的包裝類,註意是一個類;int的初值為0,Ingeter的初值為null。但是如果面試官再問一下Integer i = 1;int ii = 1; i==ii為true還是為false?估計就有一部分人答不出來了,如果再問一下其他的,估計更多的人會頭腦一片混亂。所以我對它們進行了總結,希望對大家有幫助。

首先看代碼:

 package cn.edu.ujn.test;
public class
integereTest
{ /** * @param args */ public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); // Integer會自動拆箱為int,所以為true System.out.println(i == i2); System.out.println(i == i3); System.out.println("**************"); Integer i5 = 127;// java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);
Integer i6 = 127; System.out.println(i5 == i6);// true Integer _i5 = 128; Integer _i6 = 128; System.out.println(_i5 == _i6);//false Integer ii5 = new Integer(127); System.out.println(i5 == ii5); // false Integer i7 = new Integer(128); Integer i8 = new Integer(128); System.out.println(i7 == i8); // false
} }

首先,11行和12行輸出結果都為true,因為Integer和int比都會自動拆箱(jdk1.5以上)。

16行的結果為true,而19行則為false,很多人都不動為什麽。其實java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);所以關鍵就是看valueOf()函數了。只要看看valueOf()函數的源碼就會明白了。JDK源碼的valueOf函數式這樣的:

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

看一下源碼大家都會明白,對於-128到127之間的數,會進行緩存,Integer i5 = 127時,會將127進行緩存,下次再寫Integer i6 = 127時,就會直接從緩存中取,就不會new了。所以16行的結果為true,而19行為false。

對於21行和24行,因為對象不一樣,所以為false。

實際運行情況如下:

技術分享圖片

我對於以上的情況總結如下:

①無論如何,Integer與new Integer不會相等。不會經歷拆箱過程,i7的引用指向堆,而new Integer()指向專門存放他的內存(常量池),他們的內存地址不一樣,所以為false(如L24)。

②兩個都是非new出來的Integer,如果數在-128到127之間,則是true(如L18),否則為false(如L18)。java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存。

③兩個都是new出來的,都為false(如L27)。

④int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比(如L13、L14)。

1.Java裏面“==”與equals()的區別:前者比較的是地址,後者比較的是內容。

2.int 是在棧裏創建的,Integer是在堆裏創建的。棧裏創建的變量要比在堆創建的速度快得多。

3.技術分享圖片

更多內容詳見博文《Java進階(三十五)java int與integer的區別

美文美圖

技術分享圖片

技術分享圖片

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

Java進階 三十四 Integer與int的種種比較你知道多少