Java的知识点20——包装类基本知识、包装类的用途、自动装箱和拆箱、包装类的缓存问题
包裝類基本知識(shí)
將基本數(shù)據(jù)類型存儲(chǔ)到Object[]數(shù)組或集合中的操作
? ? ? ? ? ?包裝類均位于java.lang包
“數(shù)字型”都是java.lang.Number的子類。Number類是抽象類,因此它的抽象方法,所有子類都需要提供實(shí)現(xiàn)。Number類提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味著所有的“數(shù)字型”包裝類都可以互相轉(zhuǎn)型。
包裝類的用途
對于包裝類來說,這些類的用途主要包含兩種:
? ? ? 1. 作為和基本數(shù)據(jù)類型對應(yīng)的類型存在,方便涉及到對象的操作,如Object[]、集合等的操作。
? ? ??2. 包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值、最小值等,以及相關(guān)的操作方法(這些操作方法的作用是在基本數(shù)據(jù)類型、包裝類對象、字符串之間提供相互之間的轉(zhuǎn)化!)。
包裝類的使用
package cn.dym09;public class Test09 {void testInteger() {Integer int1=new Integer(10);Integer int2=Integer.valueOf(20); //官方推薦這種說法// Integer對象轉(zhuǎn)化成intint a=int1.intValue();//字符串轉(zhuǎn)化成Integer對象Integer int3=Integer.parseInt("334");Integer int4=new Integer("999");//Integer對象轉(zhuǎn)化成字符串String str1=int3.toString();//一些常見int類型相關(guān)的常量System.out.println("int能表示的最大整數(shù):"+Integer.MAX_VALUE);}public static void main(String [] args) {Test09 test=new Test09();test.testInteger();} }自動(dòng)裝箱和拆箱
自動(dòng)裝箱和拆箱就是將基本數(shù)據(jù)類型和包裝類之間進(jìn)行自動(dòng)的互相轉(zhuǎn)換。
自動(dòng)裝箱:基本類型的數(shù)據(jù)處于需要對象的環(huán)境中時(shí),會(huì)自動(dòng)轉(zhuǎn)為“對象”。
? ? ? ? ? ? ? ? ? 原因:以Integer為例:在JDK1.5以前,這樣的代碼 Integer i = 5 是錯(cuò)誤的,必須要通過Integer i = new Integer(5) 這樣的語句來實(shí)現(xiàn)基本數(shù)據(jù)類型轉(zhuǎn)換成包裝類的過程;而在JDK1.5以后,Java提供了自動(dòng)裝箱的功能,因此只需Integer i = 5這樣的語句就能實(shí)現(xiàn)基本數(shù)據(jù)類型轉(zhuǎn)換成包裝類,這是因?yàn)镴VM為我們執(zhí)行了Integer i = Integer.valueOf(5)這樣的操作,這就是Java的自動(dòng)裝箱。
自動(dòng)拆箱:每當(dāng)需要一個(gè)值時(shí),對象會(huì)自動(dòng)轉(zhuǎn)成基本數(shù)據(jù)類型,沒必要再去顯式調(diào)用intValue()、doubleValue()等轉(zhuǎn)型方法。
? ? ? ? ? ? ? ? ? 如 Integer i = 5;int j = i; 這樣的過程就是自動(dòng)拆箱。
總結(jié):自動(dòng)裝箱過程是通過調(diào)用包裝類的valueOf()方法實(shí)現(xiàn)的,而自動(dòng)拆箱過程是通過調(diào)用包裝類的 xxxValue()方法實(shí)現(xiàn)的(xxx代表對應(yīng)的基本數(shù)據(jù)類型,如intValue()、doubleValue()等
package cn.dym10;public class cl01 {public static void main(String [] args) {Integer b=23; //自動(dòng)裝箱int a=new Integer(20); //自動(dòng)拆箱//下面的問題需要注意:Integer c=null;int d=c; //此處其實(shí)就是:c.intValue(),因此拋空指針異常} }包裝類的緩存問題
整型、char類型所對應(yīng)的包裝類,在自動(dòng)裝箱時(shí),對于-128~127之間的值會(huì)進(jìn)行緩存處理,其目的是提高效率
緩存處理的原理為:如果數(shù)據(jù)在-128~127這個(gè)區(qū)間,那么在類加載時(shí)就已經(jīng)為該區(qū)間的每個(gè)數(shù)值創(chuàng)建了對象,并將這256個(gè)對象存放到一個(gè)名為cache的數(shù)組中。每當(dāng)自動(dòng)裝箱過程發(fā)生時(shí)(或者手動(dòng)調(diào)用valueOf()時(shí)),就會(huì)先判斷數(shù)據(jù)是否在該區(qū)間,如果在則直接獲取數(shù)組中對應(yīng)的包裝類對象的引用,如果不在該區(qū)間,則會(huì)通過new調(diào)用包裝類的構(gòu)造方法來創(chuàng)建對象。
?1. IntegerCache類為Integer類的一個(gè)靜態(tài)內(nèi)部類,僅供Integer類使用。
?2. 一般情況下 IntegerCache.low為-128,IntegerCache.high為127,IntegerCache.cache為內(nèi)部類的一個(gè)靜態(tài)屬性
package cn.dym10;public class test01 {public static void main(String [] args) {Integer in1=-128;Integer in2=-128;System.out.println(in1==in2); //true 在緩存范圍內(nèi)System.out.println(in1.equals(in2)); //trueInteger in3=1234;Integer in4=1234;System.out.println(in3==in4); //false 不在緩存范圍內(nèi)System.out.println(in3.equals(in4)); //true} }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?包裝類在自動(dòng)裝箱時(shí)為了提高效率,對于-128~127之間的值會(huì)進(jìn)行緩存處理。超過范圍后,對象之間不能再使用==進(jìn)行數(shù)值的比較,而是使用equals方法。
總結(jié)
以上是生活随笔為你收集整理的Java的知识点20——包装类基本知识、包装类的用途、自动装箱和拆箱、包装类的缓存问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的知识点19——异常机制Exce
- 下一篇: Java的知识点21——String类、