包裝類的定義,API的使用和快取問題

zpf1813763637發表於2020-10-03

包裝類

Java提供了兩個型別系統,基本型別與引用型別,使用基本型別在於效率,然而當要使用只針對物件設計的API或新特性(例如泛型),那麼基本資料型別的資料就需要用包裝類來包裝。

序號基本資料型別包裝類(java.lang包)
1byteByte
2shortShort
3intInteger
4longLong
5floatFloat
6doubleDouble
7charCharacter
8booleanBoolean
9voidVoid

一, 裝箱與拆箱

裝箱:把基本資料型別轉為包裝類物件。

轉為包裝類的物件,是為了使用專門為物件設計的API和特性

拆箱:把包裝類物件拆為基本資料型別。

轉為基本資料型別,一般是因為需要運算,Java中的大多數運算子是為基本資料型別設計的。比較、算術等

基本數值---->包裝物件

Integer i1 = new Integer(4);//使用建構函式函式
Integer i2 = Integer.valueOf(4);//使用包裝類中的valueOf方法

包裝物件---->基本數值

Integer i1 = new Integer(4);
int num1 = i1.intValue();

JDK1.5之後,可以自動裝箱與拆箱。

注意:只能與自己對應的型別之間才能實現自動裝箱與拆箱。

Integer i = 4;//自動裝箱。相當於Integer i = Integer.valueOf(4);
i = i + 5;//等號右邊:將i物件轉成基本數值(自動拆箱) i.intValue() + 5;
//加法運算完成後,再次裝箱,把基本數值轉成物件。
Integer i = 1;
Double d = 1;//錯誤的,1是int型別

總結:物件(引用資料型別)能用的運算子有哪些?

(1)instanceof

(2)=:賦值運算子

(3)==和!=:用於比較地址,但是要求左右兩邊物件的型別一致或者是有父子類繼承關係。

(4)對於字串這一種特殊的物件,支援“+”,表示拼接。

 

二,包裝類的一些API

1、基本資料型別和字串之間的轉換

(1)把基本資料型別轉為字串

int a = 10;
//String str = a;//錯誤的
//方式一:
String str = a + "";
//方式二:
String str = String.valueOf(a);

(2)把字串轉為基本資料型別

String轉換成對應的基本型別 ,除了Character類之外,其他所有包裝類都具有parseXxx靜態方法可以將字串引數轉換為對應的基本型別,例如:

  • public static int parseInt(String s):將字串引數轉換為對應的int基本型別。

  • public static long parseLong(String s):將字串引數轉換為對應的long基本型別。

  • public static double parseDouble(String s):將字串引數轉換為對應的double基本型別。

或把字串轉為包裝類,然後可以自動拆箱為基本資料型別

  • public static Integer valueOf(String s):將字串引數轉換為對應的Integer包裝類,然後可以自動拆箱為int基本型別

  • public static Long valueOf(String s):將字串引數轉換為對應的Long包裝類,然後可以自動拆箱為long基本型別

  • public static Double valueOf(String s):將字串引數轉換為對應的Double包裝類,然後可以自動拆箱為double基本型別

注意:如果字串引數的內容無法正確轉換為對應的基本型別,則會丟擲java.lang.NumberFormatException異常。

int a = Integer.parseInt("整數的字串");
double d = Double.parseDouble("小數的字串");
boolean b = Boolean.parseBoolean("true或false");

int a = Integer.valueOf("整數的字串");
double d = Double.valueOf("小數的字串");
boolean b = Boolean.valueOf("true或false")

2、資料型別的最大最小值

Integer.MAX_VALUE和Integer.MIN_VALUE
Long.MAX_VALUE和Long.MIN_VALUE
Double.MAX_VALUE和Double.MIN_VALUE

3、字元轉大小寫

Character.toUpperCase('x');
Character.toLowerCase('X');

 

4、整數轉進位制

Integer.toBinaryString(int i) 
Integer.toHexString(int i)
Integer.toOctalString(int i)

 

三,包裝類物件的快取問題

包裝類快取物件
Byte-128~127
Short-128~127
Integer-128~127
Long-128~127
Float沒有
Double沒有
Character0~127
Booleantrue和false
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true

Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false

Integer i = new Integer(1);//新new的在堆中
Integer j = 1;//這個用的是緩衝的常量物件,在方法區
System.out.println(i == j);//false

Integer i = new Integer(1);//新new的在堆中
Integer j = new Integer(1);//另一個新new的在堆中
System.out.println(i == j);//false
@Test
	public void test3(){
		Double d1 = 1.0;
		Double d2 = 1.0;
		System.out.println(d1==d2);//false 比較地址,沒有快取物件,每一個都是新new的
	}

 

四,面試題

1、型別轉換問題

@Test
	public void test4(){
		Double d1 = 1.0;
		double d2 = 1.0;
		System.out.println(d1==d2);//true 和基本資料型別比較會自動拆箱,比較資料值
	}
	
	@Test
	public void test2(){
		Integer i = 1000;
		double j = 1000;
		System.out.println(i==j);//true  會先將i自動拆箱為int,然後根據基本資料型別“自動型別轉換”規則,轉為double比較
	}
	
	@Test
	public void test(){
		Integer i = 1000;
		int j = 1000;
		System.out.println(i==j);//true 會自動拆箱,按照基本資料型別進行比較
	}

2、不可變物件

public class TestExam {
	public static void main(String[] args) {
		int i = 1;
		Integer j = new Integer(2);
		Circle c = new Circle();
		change(i,j,c);
		System.out.println("i = " + i);//1
		System.out.println("j = " + j);//2
		System.out.println("c.radius = " + c.radius);//10.0
	}
	
	/*
	 * 方法的引數傳遞機制:
	 * (1)基本資料型別:形參的修改完全不影響實參
	 * (2)引用資料型別:通過形參修改物件的屬性值,會影響實參的屬性值
	 * 這類Integer等包裝類物件是“不可變”物件,即一旦修改,就是新物件,和實參就無關了
	 */
	public static void change(int a ,Integer b,Circle c ){
		a += 10;
//		b += 10;//等價於  b = new Integer(b+10);
		c.radius += 10;
		/*c = new Circle();
		c.radius+=10;*/
	}
}
class Circle{
	double radius;
}

 

 

相關文章