Java 包裝類

愚生淺末發表於2022-07-03

概述

​  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
num3
num4: 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
歡迎關注我的公眾號:愚生淺末,一起學習交流。

相關文章