什么是包裝類
在Java中,包裝類(Wrapper Class)是為基本數據類型提供的對應的引用類型。Java中的基本數據類型(如int、char、boolean等)不是對象,為了在需要對象的場景中使用基本數據類型(如集合框架、泛型等),Java提供了包裝類。
每種基本數據類型都有對應的包裝類:
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
包裝類可以將基本數據類型的值包裝為對象,同時提供了許多用于操作基本數據類型的方法。
包裝類是值類型還是引用類型,使用=會改變原來的對象嗎?
-
包裝類是引用類型:所有包裝類都是java.lang包下的類,它們創建的實例都是對象,因此屬于引用類型。
-
使用=不會改變原來的對象:當使用
=
為包裝類變量賦值時,實際上是將引用指向了新的對象,而不是修改原來的對象。因為包裝類是不可變的(immutable),它們的內部值一旦創建就無法修改。
示例:
Integer a = new Integer(10);
Integer b = a;
b = new Integer(20);
// 此時a仍然是10,b是20,a的值沒有被改變
包裝類的緩存機制
Java中部分包裝類提供了緩存機制,對一定范圍內的值進行緩存,以提高性能和減少內存占用。當使用自動裝箱或valueOf()方法創建對象時,會優先使用緩存中的對象。
包裝類 | 緩存范圍 | 緩存機制說明 |
---|---|---|
Byte | -128 ~ 127 | 全部緩存,范圍內的值會復用同一個對象 |
Short | -128 ~ 127 | 固定范圍緩存,超出范圍會創建新對象 |
Integer | -128 ~ 127 | 默認范圍緩存,可通過JVM參數調整上限 |
Long | -128 ~ 127 | 固定范圍緩存,與Short相同 |
Character | 0 ~ 127 | 緩存ASCII字符范圍內的字符 |
Float | 無緩存 | 沒有實現緩存機制 |
Double | 無緩存 | 沒有實現緩存機制 |
Boolean | true和false | 只緩存兩個靜態實例:TRUE和FALSE |
緩存機制示例:
Integer i1 = 100; // 自動裝箱,使用緩存
Integer i2 = 100;
System.out.println(i1 == i2); // true,指向同一個緩存對象Integer i3 = 200; // 超出緩存范圍
Integer i4 = 200;
System.out.println(i3 == i4); // false,指向不同對象