Integer與int的種種比較你知道多少?[轉]

 轉載:http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.htmlhtml

若是面試官問Integer與int的區別:估計大多數人只會說道兩點,Ingeter是int的包裝類,int的初值爲0,Ingeter的初值爲null。可是若是面試官再問一下Integer i = 1;int ii = 1; i==ii爲true仍是爲false?估計就有一部分人答不出來了,若是再問一下其餘的,估計更多的人會頭腦一片混亂。因此我對它們進行了總結,但願對你們有幫助。java

  首先看代碼:面試

package com.test;
/**
 * 
 * @author 劉玲
 *
 */
public class TestInteger {

    /**
     * @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(123);
        System.out.println(i7 == i8);  //false
    }

}

首先,17行和18行輸出結果都爲true,由於Integer和int比都會自動拆箱(jdk1.5以上)。緩存

22行的結果爲true,而25行則爲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了。因此22行的結果爲true,而25行爲false。spa

對於27行和30行,由於對象不同,因此爲false。翻譯

我對於以上的狀況總結以下:code

  ①不管如何,Integer與new Integer不會相等。不會經歷拆箱過程,i3的引用指向堆,而i4指向專門存放他的內存(常量池),他們的內存地址不同,因此爲false
  ②兩個都是非new出來的Integer,若是數在-128到127之間,則是true,不然爲false
  java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存
  ③兩個都是new出來的,都爲false
  ④int和integer(不管new否)比,都爲true,由於會把Integer自動拆箱爲int再去比
orm

 

若是你們以爲有什麼不對的地方,歡迎指示。htm

相關文章
相關標籤/搜索