概述
Java為每一個基本資料型別提供了對應的一個包裝類。包裝類是一個類,這樣Java就可以在包裝類中提供常用的方法等供我們使用。
java並不是純物件導向的語言,java語言是一個物件導向的語言,但是java中的基本資料型別卻不是物件導向的,但是我們在實際使用中經常將基本資料型別轉換成物件,便於操作,比如,集合的操作中,這時,我們就需要將基本型別資料轉化成物件!
基本資料型別和對應包裝類的對應關係為:
基本資料型別 | 包裝類 |
---|---|
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
包裝類的功能基本類似本文就以Integer為例子演示。
建立物件
直接使用字面值
public static void main(String[] args) {
Integer i = 10;
}
使用構造方法
public static void main(String[] args) {
Integer i = new Integer(10);
Integer i2 = new Integer("11");
}
使用靜態方法valueOf
public static void main(String[] args) {
Integer i = Integer.valueOf(10);
Integer i2 = Integer.valueOf("11");
}
常用方法
方法 | 解釋 |
---|---|
static Integer valueOf(int i) | 把int轉換轉換成Integer物件返回 |
static Integer valueOf(String s) | 把字串轉換轉換成Integer物件返回 要求字串的內容必須為純數字 |
static int parseInt(String s) | 把字串轉換轉換成int返回 要求字串的內容必須為純數字 |
public static void main(String[] args) {
Integer i = Integer.valueOf(10);
Integer i2 = Integer.valueOf("11");
int num = Integer.parseInt("123");
System.out.println(num);
}
結果:
自動裝箱與自動拆箱
概述
在JDK1.5中就增加了自動裝箱和自動拆箱。主要是讓基本資料類和對應的包裝類進行自動的轉換,方便我們的使用。
自動裝箱
自動裝箱就是基本資料型別可以自動轉換為對應的包裝類。例如:
Integer i = 10;
int num = 20;
Integer i2 = num;
自動拆箱
自動拆箱就是包裝類可以自動轉換為基本資料型別。例如:
Integer i = new Integer(10);
int num = i;
原理
- 自動裝箱其實是通過包裝類的靜態方法valueOf來實現的轉換。
- 自動拆箱有個很典型的用法就是在進行運算的時候:因為物件時不直接進行運算的,而是要轉化為基本資料型別後才能進行加減乘除
例:
Integer num = 10;
//進行計算時隱含的有自動拆箱
System.out.println(num--);
下面說點稍微難點的,是稍微
//在-128~127 之外的數
Integer num1 = 297; Integer num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// 在-128~127 之內的數
Integer num3 = 97; Integer num4 = 97;
System.out.println("num3==num4: "+(num3==num4));
結果:
列印的結果是:
num1num2: false
num3num4: true
很奇怪吧:這就歸結於java對於Integer與int的自動裝箱與拆箱的設計,是一種模式:叫享元模式(flyweight)
為了加大對簡單數字的重利用,java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體中被重用,始終只存在一個物件
而如果超過了從–128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次裝箱時都新建一個 Integer物件;明白了吧
以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行例項化,就會每次new就都一個新的物件;
這個的自動裝箱拆箱不僅在基本資料型別中有應用,在String類中也有應用,比如我們經常宣告一個String物件時:
String str = "sl";
//代替下面的宣告方式
String str = new String("sl");
如圖片失效等情況請參閱公眾號文章:https://mp.weixin.qq.com/s/5tr-KUiVNJz0LbeEuTAw_A
歡迎關注我的公眾號:愚生淺末,一起學習交流。