十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章將為大家詳細(xì)講解有關(guān)Java自動(dòng)拆裝箱的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到梅江網(wǎng)站設(shè)計(jì)與梅江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋梅江地區(qū)。
一、拆裝箱概念
所謂的拆裝箱,就是自從JDK1.5之后,java的基本類型和引用類型之間的相互轉(zhuǎn)換。
1.1拆箱
拆箱就是把Long,Integer,Double,F(xiàn)loat 等將基本數(shù)據(jù)類型的首字母大寫的相應(yīng)的引用類型轉(zhuǎn)化為基本數(shù)據(jù)類型的動(dòng)作就叫拆箱。
1.2裝箱
裝箱就是把byte ,int ,short, long ,double,float,boolean,char 這些Java的基本數(shù)據(jù)類型在定義數(shù)據(jù)類型時(shí)不聲明為相對(duì)應(yīng)的引用類型,在編譯器的處理下自動(dòng)轉(zhuǎn)化為引用類型的動(dòng)作就叫做裝箱。
二、拆裝箱的相關(guān)應(yīng)用
在JDK1.5后,當(dāng)我們進(jìn)行基本類型和引用類型的轉(zhuǎn)換的時(shí)候就會(huì)方便:
package com.hzp.CZX; /** * 測(cè)試拆裝箱 * @author 夜孤寒 * @version 1.1.1 */ public class TestDemo { /** * 拆裝箱JDK1.5后 */ public static void first(){ Integer i=7;//基本類型-->引用類型 int j=i;//引用類型-->基本類型 System.out.println(j); } /** * 拆裝箱JDK1.4 */ public static void second(){ Integer i=new Integer(78); int j=i.intValue(); System.out.println(j); } /** * 測(cè)試方法 * @param args */ public static void main(String[] args) { first(); second(); } }
上面介紹了關(guān)于拆裝箱的一些基本點(diǎn)和使用方式,但是要使用拆裝箱的話還有一些注意點(diǎn)需要注意,下面將這些注意點(diǎn)進(jìn)行一些總結(jié)。
三、注意點(diǎn)
首先貼一段代碼如下:
package com.ygh.CZX; /** * 關(guān)于java的拆裝箱范圍剖析 * @author 夜孤寒 * @version 1.1.1 */ public class Test { /** * 以Integer類型為例 */ public static void first(){ Integer i=new Integer(124); Integer j=new Integer(124); System.out.println(i==j);//false Integer a1=-128; Integer a2=-128; System.out.println(a1==a2);//true Integer b1=-129; Integer b2=-129; System.out.println(b1==b2);//false Integer c1=127; Integer c2=127; System.out.println(c1==c2);//true Integer d1=128; Integer d2=128; System.out.println(d1==d2);//false } public static void main(String[] args) { first(); } }
簡(jiǎn)單解釋一下:
第一個(gè)結(jié)果為false的原因是因?yàn)閯?chuàng)建了不同的對(duì)象,所以兩者不一樣;
但是第二個(gè)和第三個(gè)的結(jié)果為什么不一樣?
下面貼出關(guān)于Integer類的源碼,從源碼的角度來分析這個(gè)問題:
/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} instance is not * required, this method should generally be used in preference to * the constructor {@link #Integer(int)}, as this method is likely * to yield significantly better space and time performance by * caching frequently requested values. * * This method will always cache values in the range -128 to 127, * inclusive, and may cache other values outside of this range. * * @param i an {@code int} value. * @return an {@code Integer} instance representing {@code i}. * @since 1.5 */ public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
上面的代碼是說,進(jìn)行自動(dòng)拆裝箱的時(shí)候,是有一個(gè)范圍的,一旦超出這個(gè)范圍,那么指向的就不是同一個(gè)對(duì)象,而是返回一個(gè)新創(chuàng)建的對(duì)象了,這個(gè)范圍在Integer類中的一個(gè)內(nèi)部私有類IntegerCache可以體現(xiàn)出來,源碼如下:
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
從這里我們可以看出,范圍值為[-128,127]之間。
注意,Integer、Short、Byte、Character、Long這幾個(gè)類的valueOf方法的實(shí)現(xiàn)是類似的。
Double、Float的valueOf方法的實(shí)現(xiàn)是類似的。
總結(jié):這些進(jìn)行自動(dòng)拆裝箱的基本類型的范圍如下:
1. boolean類型的值
2.所有的byte的值
3.在-128~127的short類型的值
4.在-128~127的int類型的值
5.在\ u0000~\ u00ff 之間的char類型的值
而其中double和float又有所不同,我們就以double為例子,貼出代碼討論:
package com.ygh.CZX; /** * 關(guān)于java的拆裝箱范圍剖析 * * @author 夜孤寒 * @version 1.1.1 */ public class Test { /** * Double */ public static void first() { Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1 == i2);//false System.out.println(i3 == i4);//false } /** * 測(cè)試方法 */ public static void main(String[] args) { first(); } }
注意為什么上面的代碼的輸出結(jié)果都是false呢?同樣的我們依舊以Double類中的valueOf方法來討論,貼出源碼就一目了然了:
/** * Returns a {@code Double} instance representing the specified * {@code double} value. * If a new {@code Double} instance is not required, this method * should generally be used in preference to the constructor * {@link #Double(double)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param d a double value. * @return a {@code Double} instance representing {@code d}. * @since 1.5 */ public static Double valueOf(double d) { return new Double(d); }
也就是說不管你的double是什么范圍的值,他都是給你返回一個(gè)新的對(duì)象。float同double,就不過多贅述了。
關(guān)于“Java自動(dòng)拆裝箱的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。