Java中包裝類介紹與其注意事項
前言
大家都知道在Java中,除了8種基本數據類型外,其他的都是引用類型。使用引用類型是為了更好地貫徹面向對象的思想,那為什么還要保留8種基本數據類型呢?
這其實更多地是照顧程序員的習慣。為了既照顧程序員的習慣,同時又能全面貫徹面向對象編程的思想,Java中引入了包裝類機制。
所謂的包裝類就是為8種基本數據類型分別定義了相應的引用類型,其對應關系如下:
顯然,除了int及char外,其余的包裝類都是將對應的基本數據類型的首字母大寫即可。 那為什么要引入包裝類呢?前面已經說過,是為了全面貫徹面向對象的編程思想,具體地說就是非引用類型的數據在使用時會有許多制約,比如List list=new ArrayList();
對于引用類型,可直接使用list.add(obj);
進行添加,但是對于基本數據類型則無法添加,從而不能使用ArrayList中的許多方法(如排序、刪除等),顯然會造成許多不便,而使用包裝類則可以很好地避免這種缺陷。
同時,從JDK 1.5開始提供了自動裝箱和自動拆箱的功能,因而目前可以有以下3種初始化包裝類的方法:
方法1:直接傳入相應的基本數據類型變量或常量,如
int a1=3;Integer a2=new Integer(a1); Float f=new Float(3.14f); Boolean b=new Boolean(true);
方法2:通過傳入字符串,如
Integer a=new Integer("3"); Float f=new Float("3.14"); Boolean b=new Boolean("true");
值得注意的是使用"True"也可以,如Boolean b=new Boolean(“True”);
方法3:通過自動裝箱功能,如Integer a=3;Float f=3.14f;Boolean b=true;
值得注意的是可使用new Float(“3.14”)
和new Float(“3.14f”)
這樣的語句來初始化Float類型變量,但是卻不能使用Float f=3.14;
來初始化Float類型變量,因為3.14是double類型,它只能被自動裝箱為Double類型變量。
我們知道,引用類型使用==進行比較時,只有當二者指向同一個對象時,才會返回true,否則即使值相等也返回false.包裝類也屬于引用類型,所以以下代碼的執(zhí)行結果為false,
Float f1=new Float(3.14f); Float f2=new Float(3.14f); System.out.println(f1==f2);
但是,下面一段代碼的輸出結果卻和前面討論的不一樣,這是為什么呢?
import java.util.*; public class TestWrapperClass { public static void main(String[]args) { Integer t1=3; Integer t2=3; System.out.println(t1==t2); Integer t3=128; Integer t4=128; System.out.println(t3==t4); Boolean b1=true; Boolean b2=true; System.out.println(b1==b2); } }
其輸出結果如下圖所示:
如果按照前面的討論,應該都輸出false才對,但這里t1與t2,b1與b2的比較結果卻為true.這不科學啊!
原來,Java為了獲得更高的執(zhí)行效率,在某些類的設計中引入了緩存機制!
此處的Integer及Boolean類的設計即是如此。java.lang.Integer
類的部分源代碼如下所示:
static final Integer[]cache=new Integer[-(-128)+127+1]; static{ for(int i=0;i<cache.length;i++) cache[i]=new Integer[i-128); }
顯然,系統(tǒng)把-128~127之間的整數裝箱成Integer實例,并通過cache數組進行緩存,所以只要是-128~127之間的Integer類型變量,其指向的對象都是cache數組成員,從而只要有兩個值相同且在-128~127之間的Integer變量,它們指向的對象就是同一個,故采用==進行比較時也返回true.Boolean的情形與之類似。
實際上,不只是在Java中,在Android中的一些類也采用了緩存機制,如Android中的ListView就是一個典型的例子,在繼承的方法getView中,convertView其實就是采用了緩存機制,從而大大節(jié)省了系統(tǒng)資源開支,加快了圖形渲染的速度。此處暫且不表,在后面還會再提到。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言留言交流。
相關文章
Java中JUC包(java.util.concurrent)下的常用子類
相信大家已經對并發(fā)機制中出現的很多的常見知識點進行了總結,下面這篇文章主要給大家介紹了關于Java中JUC包(java.util.concurrent)下的常用子類的相關資料,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12Spring?Data?JPA實現持久化存儲數據到數據庫的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎上封裝的?套 JPA 應?框架,可使開發(fā)者?極簡的代碼即可實現對數據庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實現數據持久化存儲到數據庫,感興趣的可以了解一下2022-04-04SpringBoot2 整合Ehcache組件,輕量級緩存管理的原理解析
這篇文章主要介紹了SpringBoot2 整合Ehcache組件,輕量級緩存管理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08java中Statement 與 PreparedStatement接口之間的關系和區(qū)別
這篇文章主要介紹了java中Statement 與 PreparedStatement接口之間的關系和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07IDEA2021.2配置docker如何將springboot項目打成鏡像一鍵發(fā)布部署
這篇文章主要介紹了IDEA2021.2配置docker如何將springboot項目打成鏡像一鍵發(fā)布部署,本文圖文實例相結合給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09Java定時任務Timer、TimerTask與ScheduledThreadPoolExecutor詳解
這篇文章主要介紹了Java定時任務Timer、TimerTask與ScheduledThreadPoolExecutor詳解, 定時任務就是在指定時間執(zhí)行程序,或周期性執(zhí)行計劃任務,Java中實現定時任務的方法有很多,本文從從JDK自帶的一些方法來實現定時任務的需求,需要的朋友可以參考下2024-01-01Java使用html2image將html生成縮略圖圖片的實現示例
本文主要介紹了Java使用html2image將html生成縮略圖圖片的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12