1. 程式人生 > >Java自動裝拆箱boxing與unboxing

Java自動裝拆箱boxing與unboxing

參考文章:

先看下面一段程式碼,想想它的輸出結果是什麼?

		Integer a = 100;
		Integer b = 100;
		Integer c = 1000;
		Integer d = 1000;
		Integer e=new Integer(100);
		Integer f=new Integer(100);
		int m=100;
		System.out.println(a == b);
		System.out.println(a.equals(b));
		System.out.println(c == d);
		System.out.println(c.equals(d));
		System.out.println(e == f);
		System.out.println(e.equals(f));
		System.out.println(e == m);
		System.out.println(a == m);
		System.out.println(a.equals(m));
輸出結果為(jdk1.7):
true
true
false
true
false
true
true
true
true

原因:"==" 對於兩個物件來說比較的是物件的引用,equals比較的是內容。按照Java虛擬機器的規範:特定的primitive一定得被auto-box成相同的不可變的wrapper class物件,這些物件會被快取記憶體以便重複使用。這些特定的值包括:boolean值的false與true,所有的byte值,介於-128到127之間的short和int值,以及介於0到0x7f之間的所有char值。

也就是說變數 a和b指向同一個物件,因為值小於127,所以a==b為true;c和d表示的值超過了127,因此會分別建立一個新的物件,所以c==d為false;對於變數e和f,儘管二者的內容小於127,但是由於這兩個物件都是使用new產生出來的,不適用於自動裝箱boxing的快取規則,因此e==f為false。而當一個封裝型別與基本型別比較時,封裝型別會自動拆箱成基本型別,因此 e==m和a==m均為true。

最後摘抄一段來自第三個連結的結論(原文來自 xelz' blog ,連結地址:http://www.cnblogs.com/mingcn/archive/2010/10/20/JavaAutoBoxing.html)

對於值相等的兩個“物件”,如果有一個是基本資料型別,則"=="總恆為true(這裡其實是將包裝型別UnBoxing)

如果兩個都是包裝型別,則

如果有一個是通過new創建出來的,"=="為false(分配了新的空間)

否則(即都不是通過new建立,AutoBoxing的結果)

如果該值是boolean/byte/float/double型別之一

或者char/short/int/long型別之一併且值範圍在-127 ~ 128

之間,==為true,否則==為false



相關推薦

Java自動boxingunboxing

參考文章: 先看下面一段程式碼,想想它的輸出結果是什麼? Integer a = 100; Integer b = 100; Integer c = 1000; Integer d = 1000; Integer e=new Integer(1

Java支持的數據類型有哪些?什麽時候自動

回來 ring 但是 cache rep 位置 ++ 提高 自動拆箱 java中的8種基本數據類型:boolean byte char short int float double long 自動拆裝箱的問題引入: 由於在一開始學習java的時候,”萬物皆對象“這種

java自動裝箱特性

 http://www.cnblogs.com/dolphin0520/p/3780005.html 在Java SE5 之前,如果要生成一個數值為10的Integer物件,必須這樣進行: Integer i = new Integer(10); 而在 從Java SE5開始&nbs

JAVA自動裝箱以及裝箱時的快取問題

概述 JAVA中的自動裝箱指的是把基本型別的值轉換為對應的包裝類物件,自動拆箱則相反。 JAVA中的基本型別: boolean/1, byte/8, char/16, short/16, int/32, long/64,float/32, double/64 基本型別都

java自動裝箱總結

對於java1.5引入的自動裝箱拆箱,之前只是知道一點點,最近在看一篇部落格時發現自己對自動裝箱拆箱這個特性瞭解的太少了,所以今天研究了下這個特性。以下是結合測試程式碼進行的總結。 測試程式碼: int a = 1;

詳解Java自動裝箱(Autoboxing and unboxing)

初始 BE 運算 null 異常 內存 判斷 運行 double 一、什麽是自動裝箱拆箱 很簡單,下面兩句代碼就可以看到裝箱和拆箱過程 1 //自動裝箱 2 Integer total = 99; 3 4 //自定拆箱 5 int totalprim = total;

java基礎(八) 深入解析常量池機制

java引言 ??本文將介紹常量池 與 裝箱拆箱機制,之所以將兩者合在一起介紹,是因為網上不少文章在談到常量池時,將包裝類的緩存機制,java常量池,不加區別地混在一起討論,更有甚者完全將這兩者視為一個整體,給初學者帶來不少困擾,我就是過來的。同時,也因為包裝類的緩存 與 字符串常量池的思想是一樣的,很容易混

Java程式設計師面試,自動/原理包裝類的緩衝機制你知道麼?

概述 本文中小編為大家細緻的講解了Java中基本資料型別對應的包裝類以及包裝類的緩衝機制在實際開發中的應用 。 並且對Java中基本資料型別的包裝類的主要應用---自動封箱、自動拆箱做了底層剖析 。 自JDK1.5開始, 引入了自動裝箱/拆箱這一語法糖, 它使程式設計師

自動裝箱(Autoboxing,Unboxing)

包裝類 iter oracl ble 類型 doc section tps 技術 自動裝箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unb

Java的==和equals()以及自動裝箱

char AC oid name span 兩個 也會 掌握 word 拋一個問題 大家先看下面的代碼,先不要看答案自己做一下: public class AutoboxingTest { public static void main(String[] args)

Java的資料型別 和自動裝箱機制

Java的資料型別 和裝箱拆箱機制 資料型別 第一類整數型(byte short int long) Java各整數型有固定的表示範圍和欄位長度 ,不會受到不同作業系統的影響,這點確保了java程式的可移植性。 Java中整數型的資料預設值為int. 表示方式 十進位制:123 八

JAVA】談談裝箱

                                          談

java中的裝箱

如果你在Java1.5下進行過程式設計的話,你一定不會陌生這一點,你不能直接地向集合(Collections)中放入原始型別值,因為集合只接收物件。通常這種情況下你的做法是,將這些原始型別的值轉換成物件,然後將這些轉換的物件放入集合中。使用Integer,Double

java中的自動裝箱

/** * 自動裝箱,將基本型別轉化為物件 */ Integer autoboxingInt = 10; //以上的宣告就是用到了自動的裝箱:解析為:Integer autoboxingInt = new Integer(10); //9是屬於基本資料

java-裝箱和

占用 基本類 ole main 分析 實現 生成 結果 不同 一、什麽是裝箱拆箱?   java為每種基本數據類型提供了對應的包裝器類型 Integer i = 10; 拿煙的手微微顫抖:這樣就生成了一個特數值為10的Integer對象,這個過程中會自動創建對應的Int

理解JDK1.5的自動裝箱

特性 ava 創建 幫我 max 循環 assert rally jdk1 JDK1.5的升級引入了裝箱和拆箱概念,簡單說就是為了簡化書寫。   JDK1.5之前,創建Integer對象是需要這麽寫的 Integer i = new Integer("3");   JDK

java之裝箱

img 類類型 需要 子類 ble package static ger 編譯錯誤 參考http://how2j.cn/k/number-string/number-string-wrap/22.html 封裝類 所有的基本類型,都有對應的類類型 比如int對應的類是In

Java中的和裝箱

基本數據 JD 基本數據類型 AS val 類型 sys 裝箱 數據 一.拆箱和裝箱的概念   裝箱:將基本數據類型的值轉為引用類型的值;   拆箱:將引用類型的值轉換為基本數據類型的值; 二.實例演示 public class Example19 { public

6個關於Java包裝類和裝箱的判斷題,你能做對幾個?

雖然 Java 語言是典型的面向物件程式語言,但其中的八種基本資料型別並不支援面向物件程式設計,基本型別的資料不具備“物件”的特性——不攜帶屬性、沒有方法可呼叫。為此,Java為每種基本資料型別分別設計了對應的類,稱之為包裝類(Wrapper Classes)。 裝箱(Box

基本型別包裝類、自動裝箱

基本型別包裝類 public class Demo03 { public static void main(String[] args) { //字串轉基本資料型別 String str="12"; int strint=Integer.p