package com.linjunlong.fun.jdk15;
import java.util.ArrayList;
/**
* 功能:自動(dòng)裝箱/拆箱
* 編譯器自動(dòng)進(jìn)行基本類型和對應(yīng)的包裝類型進(jìn)行轉(zhuǎn)換
* byte
<--> Byte
* short
<--> Short
* int
<--> Integer
* long
<--> Long
* float
<--> Float
* double
<--> Double
* char
<--> Character
* boolean
<--> Boolean
*
* @author linjunlong.com
*/
public class AutoBoxingOrUnBoxing
{
/**
* 這里我們以Integer為實(shí)例
*/
public void jdk14() {
// 在jdk1.4中,初始話一個(gè)值類型對應(yīng)的包裝類,你需要這么寫
Integer integer = new Integer(1);
int i = integer.intValue();
// 如果你需要在數(shù)組中添加一個(gè)數(shù)值類型的話,你還需要把他轉(zhuǎn)成基礎(chǔ)類型
new ArrayList().add(new Integer(i));
}
public void jdk15() {
// 在jdk1.5中你可以這么寫; int --> Integer
Integer integer = 1;
// Integer --> int
int i = integer;
// 這里你可以直接添加數(shù)值類型
new ArrayList().add(i);
}
public static void main(String[] args) {
/*
* 這里有一些有趣的特性,享元模式,
* 經(jīng)過裝箱和解箱的對象只要大小在-128到127之間(byte類型的范圍之間)
* 都會(huì)在jvm內(nèi)存的對象緩存池里形成記錄,下次有裝箱和解箱行為的對象,
* 都會(huì)直接指向這個(gè)緩存次里的對象
*/
Integer num1 = 20;
int num2 = new
Integer(20);
System.out.println( num1 == num2);
//@answer1
Integer int1 = new Integer(20);
Integer int2 = new Integer(20);
System.out.println( int1 == int2);
//@answer2
System.out.println(num1 == int1);
//@answer3
System.out.println(num1 ==
int1*1);//@answer4
//->answer1:true num1 和num2都經(jīng)過了裝箱和解箱,都指向緩存池里的對象20
//->answer2:false int1 和int2 沒經(jīng)過裝箱和解箱,2個(gè)是不同的對象,比較他們的引用地址肯定也不一樣
//->ansewr3:false 一個(gè)在的引用地址指向緩存池,一個(gè)是指向?qū)ο?span lang="EN-US">[20]的引用地址2個(gè)也不相等
//->answer4:true 后面int1經(jīng)過了解箱然后*1運(yùn)算,然后又裝箱成Integer類型,所以他的引用地址也是緩存池里的地址
}
}
|