java基本类型的包装类型_有了基本数据类型,为什么还需要包装类型
在java中有八種基本數據類型對應每種基本類型又有八種包裝類型:
基本類型:boolean, char, int, byte,short,long, float,double
包裝器類型:Boolean,Character,Integer,Byte,Short,Long,Float,Double
從上面我們可以看到除了 char和int其它的包裝類型名稱和對應的基本類型一樣只是首字母大寫了。
既然有了基本類型為什么還要有包裝類呢?我們在使用的過程中究竟用基本類型還是包裝類呢?
在某些場合不能使用基本類型必須使用包裝類,比如集合能接收的類型為Object,基本類型是無法添加進去的,還有范型也必須使用包裝類。
另外假設我們要定義一個變量表示分數 如果用基本類型表示的話:int score;
默認值為零,如果我想表示分數為空也就是沒有參加考試就沒法表現了因為值類型是無法賦空值的,如果使用包裝類型Integer score,就可以表示這種情況,因為Integer的默認值為空。
包裝類型是引用類型,說白了就是一個類,既然是類,里面可以有屬性和方法,它里面有哪些屬性和方法呢?每個包裝類型和基本數據類型都是大同小異的,我們拿Integer 和 int來舉例說明:
假設有這樣一個場景,我接收到一個String型的數據想把它轉換為整型,如果沒有包裝類這個操作是無法完成的,有了包裝類我們可以這樣做:
String num1 = "123";
intnum2 = Integer.parseInt(num1);
parseInt就是Integer包裝類提供的一個將字符串轉成int型的方法。
包裝類還有一個很重要的特新就是數據緩存:
還是拿Integer來舉例,在-128~127區間的數會被緩存,當類加載的時候就創建這256個數對應的對象,并放到名為cache的數組中,調用valueOf()方法時會先判斷該數是否在-128~127的區間,如果在則直接獲取數組中該對象的引用,如果不在則創建該對象。valueOf()方法的源碼如下:
public staticInteger valueOf(inti) {
if(i >= IntegerCache.low&& i <= IntegerCache.high)
returnIntegerCache.cache[i + (-IntegerCache.low)];
return newInteger(i);
}
這里IntegerCache.low為-128,IntegeCache.high為127,IntegerCache.cache為數組存儲的就是-128到127的Integer對象。
在自動裝箱的時候調用的就是valueOf方法。
我們來看下面這段代碼:
public static voidmain(String[] args) {
Integer num1 = 4;
Integer num2 = 4;
System.out.println(num1==num2);
System.out.println(num1.equals(num2));
Integer num3 = 145;
Integer num4 = 145;
System.out.println(num3==num4);
System.out.println(num3.equals(num4));
}
運行結果是:
true
true
false
true
為什么會是這個結果呢?
Integer num1 = 4,這里發生了自動裝箱,調用了ValueOf()方法,因為4在-128~127之間所以num1和num2都指向了緩存中的同一地址,所以用==比較和equls比較返回的都是true.
Integer num3 = 145,因為145不在這個范圍區間,所以會在堆中生成對象num3和num4分別指向兩個不同地址的對象,所以===返回false。從這個例子我們可以看出,如果要進行比較最好使用equals,如果使用==在數值范圍不同的情況下得到的結果也是不同的。
各包裝類緩存的取值范圍:
· Boolean:使用靜態 final 定義;
· Byte:緩存區 -128~127
· Short:緩存區 -128~127;
· Character:緩存區 0~127;
· Long:緩存區 -128~127;
· Integer:緩存區 -128~127。
Float 和 Double 不會有緩存。
那么具體什么時候使用基本數據類型什么時候使用包裝類呢?
有一個典型的場景,比如在控制器中接收一個參數該參數定義成了基本數據類型int那么傳過來的參數如果為空則會報空指針錯誤,如果定義為其包裝類型Integer則不會報錯,而是得到一個null值。所以在RPC方法里面參數和返回值類型都需要用包裝類。
我們再來看一個情況:Pojo類中如果定義成基本類型,數據庫中對應的字段為空的時候映射時會出問題。因為基本類型不能賦null。所以在Pojo類中數據類型都需要定義成包裝類。
如果是局部變量我們一般定義成基本類型,因為基本類型存儲在棧上,方法執行完畢,棧上的內存空間也隨之釋放。
總結一下:
為什么會有包裝類?
1. 包裝類里面有一些很有用的方法和屬性,如HashCode,ParseInt
2. 基本類型不能賦null值,某些場合需要。
3. 有些地方不能直接用基本類型,比如集合
什么時候用包裝類,什么時候用基本類型?
1. 在pojo類中定義的屬性用包裝類
2. 在rpc方法中定義參數和返回值的類型用包裝類
3. 定義局部變量用基本類型
最后再送你兩句話:
1:學習貴在堅持,有付出就會有收獲
2:看到有幫助的回答一定記得點個贊,以后在動態隨時能查看到回答,不怕找不到了
另外我給你準備了一套最通俗易懂的Java的視頻教程,涵蓋了零基礎到就業的所有內容
關注公眾號"極簡編程"觀看。
java視頻教程部分評價:
總結
以上是生活随笔為你收集整理的java基本类型的包装类型_有了基本数据类型,为什么还需要包装类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java没有释放内存_java – G1
- 下一篇: java版数据结构解迷宫问题_C语言数据