1. 程式人生 > >Integer的自動拆箱和自動裝箱的陷阱(整型數-128到127的值比較問題)

Integer的自動拆箱和自動裝箱的陷阱(整型數-128到127的值比較問題)

Integer的自動拆裝箱的陷阱(整型數-128到127的值比較問題):

1、先看下面的例子:

  1. package integerdemo;  
  2. publicclass IntegerDemo {  
  3.     publicstaticvoid main(String[] args) {  
  4.        //-128--127之間
  5.         Integer i1 = 100;  
  6.         Integer i2 = 100;  
  7.         if( i1 == i2){  
  8.             System.out.println("i1 == i2");  
  9.         }else
    {  
  10.             System.out.println("i1 != i2 ");  
  11.         }  
  12.        //大於127  
  13.         Integer i3 = 200;  
  14.         Integer i4 = 200;  
  15.         if( i3 == i4){  
  16.             System.out.println("i3 == i4");  
  17.         }else{  
  18.             System.out.println("i3 != i4 ");  
  19.         }  
  20.     }  
  21. }  

執行結果:

  1. run:  
  2. i1 == i2  
  3. i3 != i4   
  4. 成功構建 (總時間: 1 秒)  


以上是靠整型數的自動拆裝箱實現的,而兩者的結果卻不相同。

原因在於,在進行自動拆裝箱時,編譯器會使用Integer.valueof()來建立Integer例項。

2、以下是Integer.valueof()的原始碼:

  1. publicstatic Integer valueOf(int i) {  
  2.       assert IntegerCache.high >= 127;  
  3.       if (i >= IntegerCache.low && i <= IntegerCache.high)  
  4.           return IntegerCache.cache[i + (-IntegerCache.low)];  
  5.       returnnew Integer(i);  
  6.   }  

簡單地解釋這段程式碼,就是如果傳入的int在IntegerCache.low和IntegerCache.high之間,那就嘗試看前面的快取中有沒有打過包的相同的值,如果有就直接返回,否則就建立一個Integer例項。IntegerCache.low 預設是-128;IntegerCache.high預設是127。

注:如果要比較兩個物件的內容是否相同,儘量不使用== 或者!= 來比較,可以使用equal()來實現。

相關推薦

Integer自動自動裝箱陷阱-128到127的比較問題

Integer的自動拆裝箱的陷阱(整型數-128到127的值比較問題): 1、先看下面的例子: package integerdemo;   publicclass IntegerDemo {       publicstaticvoid main(String[] args) {         

java基本型別基本型別包裝比較時的自動自動裝箱

java中,任何物件都繼承自Object,所以都有equals()方法。在基本型別中,兩個數值之間的比較==和equals()方法,比較的都是兩個運算元的地址,地址相同,則返回值為true。在物件中,不管是自己寫的物件還是java中已經有的物件,如果這個類物件複寫了繼承自O

如何理解Java中的自動自動裝箱

小偉剛畢業時面的第一家公司就被面試官給問住了... 如何理解Java中的自動拆箱和自動裝箱? 自動拆箱?自動裝箱?什麼鬼,聽都沒聽過啊,這...這..知識盲區... 回到家後小偉趕緊查資料,我透,這不就是問基本型別跟封裝型別嗎,面試官整啥名詞呢... 別問結果,問就是沒過。 1、 什麼是自動裝箱,自動拆箱 定

Java基本資料型別的大小,他們的封裝類以及自動裝箱

Java提供了一套基本資料型別,總共有八種,也會有人說是有九種。 在我們的印象中,很多人可能會說出byte,short,int,long,float,double,boolean,char這八種資料型別。 那麼還有一種是哪種呢,它到底是不是資料型別呢? 我們很容易忽略一個void,有

java 1.5 自動裝箱的注意事項

背景 java1.5後引入了自動裝箱和自動拆箱的概念 自動拆箱:將引用型別轉化為基本資料型別 自動裝箱:將基本資料型別裝為引用型別 但是實際使用中,什麼情況自動拆箱什麼情況自動裝箱呢? 自動裝箱 Integer i = 100; (呼叫Integer.valueOf(100)) 這裡存

11、自動裝箱

什麼是自動拆箱和自動裝箱? //自動裝箱:把基本型別轉換為包裝類型別 Integer s1 = 123; //自動拆箱:把包裝類型別轉換為基本型別 Integer s2 = new Integer(10);

Integer自動自動裝箱的注意事項

java虛擬機器非常的智慧,能自動的幫助我們自動裝箱與拆箱。雖然它自動幫我們處理這些事情很是方便,但是並不是總是這樣的。有時候或許我們就會因為忽略掉這些小細節而給我們的程式留下一些bug。下面我們就來

java自動裝箱自動正常情況效能比較

自動裝箱和自動拆箱是java5.0版本引入的,能自動將基本型別轉換為對應的基本型別包裝物件,那麼我們比較一下他們的效能情況。 package com.wmmad.test; import junit.framework.TestCase; /** * @author ma

Java學習筆記 (十五) 自動自動裝箱

什麼是自動拆裝箱 自動裝箱: 就是將基本資料型別自動轉換成對應的包裝類. 自動拆箱:就是將包裝類自動轉換成對應的基本資料型別。 For example : Integer a=1; //自動裝箱 int b=a; //自動拆

Integer自動裝箱比較

一、int 和Integer比較。不管Integer是直接等於一個數值,還是=new Integer(xxx);都是Integer拆箱成int,再去和前面那個int數值比較。 二、Integer和Integer比較,存在三種情況。 a.它們兩個都是直接等於一個數值, 那麼

Java語法糖2自動裝箱自動

eth 空指針 lang 指針 反編譯 class path load pointer 自動拆箱和自動裝箱 Java為每種基本數據類型都提供了對應的包裝器類型。舉個例子: public class TestMain{public static void main(Strin

java基礎學習總結十一自動裝箱自動

自動拆箱和自動裝箱 Java為每種基本資料型別都提供了對應的包裝器型別。舉個例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } }

自動裝箱自動(慎用“==”)

先來看一段非常“簡單”的程式碼 public static void main(String[] args) { Integer i1 = 100, i2 = 100, i3 = 130, i4 = 130; System.out.println(i1 == i2); S

自動&自動裝箱以及String 基本資料型別封裝類生成的物件是否相等

自動拆箱(unboxing)&自動裝箱(boxing) @author 李東秀|| qq:1028659927 本文主要為自己理解所做的學習筆記,如有不對的地方, 望各位看官不吝指出,程式碼執行環境:Ubuntu 14.04,jdk1.7版本         在j

深入理解自動裝箱自動

一、什麼是自動裝箱、自動拆箱 此機制開始於jdk 1.5 java中有8種基本型別,對應8種基本型別有8個包裝類。 整形 實型 布林型 字元型 long/int/short/byte float/double boolean char Lon

Java的自動裝箱自動(AutoBoxing,Unboxing)

java中有8中基本的資料型別,這八種基本的資料型別都有對應的封裝型別,下面是對應關係:int——Integerfloat——Floatdouble——Doublebyte——Bytelong——Longchar——Characterboolean——Booleanshort

Java 自動裝箱自動注意的問題

        自動裝箱和自動拆箱不是什麼複雜的技術,自動裝箱就是基本型別(int,long)資料可以先自動轉換為對應的封裝類(Integer,Long)物件,而自動拆箱相反。 在本文中,筆者向大家介紹下Java中一個非常重要也非常有趣的特性,就是自動裝箱與拆箱,並從原

JavaScript基本包裝型別(自動裝箱自動)(instanceof方法)

1)為了便於操作基本型別值,ECMAScript提供了3個特殊的引用類Boolean, Number, String每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別物件,從而可以使我們呼叫一些方法操作這些資料。 在建立變數s後(var s =

JAVA一切皆對象之包裝類、自動裝箱自動

對象 包裝類 強制 用戶 類型轉換 自動轉換 方法 img 無需 每個基本類型都有一個對應的類;就是所謂的包裝類; 1,裝箱和拆箱 基本類型和類類型可以相互轉換; 基本類型到類類型的轉換叫做裝箱; 類類型到基本類型的轉換叫做拆箱; 2,自動裝箱和拆箱 在類類型

== equals 自動裝箱 自動

問題描述: 定義了兩個Integer變數,為Integer a= 200;  Integer b= 200; ,  但我比較的時候 if (a == b),卻返回false,不都是200嗎?為什麼返回false,後來改為eq