天天看點

Java之路:基本資料類型的包裝類

在介紹這之前,先說下什麼叫做API。

API (Application Programming Interface)就是應用程式程式設計接口。

假設現在要編寫一個機器人程式,去控制一個機器人踢足球,程式需要向機器人發出向前跑、向後轉、射門、攔截等指令,沒有編過程式的人很難想象如何編寫這樣的程式。但對于有程式設計經驗的人來說,就知道機器人廠商一定會提供一些控制這些機器人的Java類,該類中就有操縱機器人的各種動作的方法,隻需要為每個機器人安排一個該類的執行個體對象,再調用這個對象的各種方法,機器人就會去執行各種動作。

這個Java類就是機器人廠家提供的應用程式程式設計的接口,廠家就可以對這些Java類美其名曰:Xxx Robot API(也就是Xxx廠家的機器人API)。好的機器人廠家不僅會提供Java程式用的Robot API,也會提供Windows程式設計語言(如VC++)用的Robot API,以滿足各類程式設計人員的需要。

基本資料類型的包裝類

Java對資料既提供基本資料的簡單類型,也提供了相應的包裝類。使用基本資料類型,可以改善系統的性能,也能夠滿足大多數的應用需求。但基本資料類型不具有對象的特性,不能滿足某些特殊的需求。

從JDK中可以知道,Java中的很多類的很多方法的參數類型都是Object,即這些方法接收的參數都是對象,同時,又需要用這些方法來處理基本資料類型的資料,這時就要用到包裝類。比如,用Integer類來包裝整數。

Java之路:基本資料類型的包裝類

下面來看一個簡單的例子:

public class Demo1 {
	public static void main(String[] args) {
		String s = "123";
		int i = Integer.parseInt(s);	// 将字元串轉換成整型
		i++;
		System.out.println(i);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類

1、裝箱與拆箱

所謂裝箱,就是把基本類型用它們相對應的引用類型包起來,使它們可以具有對象的特質,例如我們可以把int型包裝成Integer類的對象,或者把double包裝成Double等。
所謂拆箱,就是跟裝箱的方向相反,将Integer及Double這樣的引用類型的對象重新簡化為值類型的資料。

例:

public class Demo1 {
	public static void main(String[] args) {
		Integer x = new Integer(10);	// 裝箱
		int temp = x.intValue();	// 拆箱
		System.out.println(temp*temp);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類

2、基本資料類型與String的互相轉換

Integer :public static int parseInt(String s);

Double :public static double parseDouble(String s);

Boolean :public static Boolean parseBoolean(String s);

public class Demo1 {
	public static void main(String[] args) {
		String s1 = "123";
		String s2 = "trueaa";
		String s3 = "true";
		int i = Integer.parseInt(s1);	// 将字元串轉換成整型
		i++;
		double d = Double.parseDouble(s1);
		d++;	// 
		boolean b1 = Boolean.parseBoolean(s2);
		boolean b2 = Boolean.parseBoolean(s3);
		System.out.println(i);
		System.out.println(d);
		System.out.println(b1);
		System.out.println(b2);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類
在将字元串變為數值型資料時需要注意,字元串的組成必須全部由數字組成。如果此時的字元串内容不是true或false,那麼程式也不會出錯,會按照false的情況進行處理(如s2)。

将基本資料類型轉換為字元串:

public class ToString {
	public static void main(String[] args) {
		int i = 100;
		double d = 120.2;
		boolean b = true;
		char c = 'a';
		// 方法1
		String str = i + "";	// 任何類型與字元串相加之後就是字元串
		System.out.println(str);
		str = d + "";
		System.out.println(str);
		str = b + "";
		System.out.println(str);
		str = c + "";
		System.out.println(str);
		
		// 方法2
		str = String.valueOf(i);
		System.out.println(str);
		str = String.valueOf(d);
		System.out.println(str);
		str = String.valueOf(b);
		System.out.println(str);
		str = String.valueOf(c);
		System.out.println(str);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類
注:方法1在将基本資料類型時必須使用一個字元串,是以一定會産生垃圾,不建議使用。

3、Integer類

Integer類的三種建立方式:

public class UseInteger {
	public static void main(String[] args) {
		// 方法1  :  用new關鍵字
		Integer num1 = new Integer(100);
		// 方法2 : 用Integer類中的valueOf() 
		Integer num2 = Integer.valueOf(200);
		// 方法3 : 自動裝箱
		Integer num3 = 300;
		System.out.println("num1 : " + num1);
		System.out.println("num2 : " + num2);
		System.out.println("num3 : " + num3);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類

4、Boolean類

java.lang.Boolean類與Integer一樣是在對象中封裝了一個基本布爾型的值。 Boolean類型的對象包含在一個單一的字段中,其類型為布爾值。與Integer一樣Boolean類也有三種生成的方式。

此外Boolean類中還内置了一些實用的方法,如下:

public class CompareBoolean {
	public static void main(String[] args) {
		Boolean b1 = new Boolean(true), 
				b2 = new Boolean(false);
		int result = b1.compareTo(b2);
		String str1 = "Both values are equal";
		String str2 = "Object values is true";
		String str3 = "Argument values is false";
		if(result == 0) {
			System.out.println(str1);
		}
		else if(result > 0) {
			System.out.println(str2);
		}
		else if(result < 0) {
			System.out.println(str3);
		}
	}
}
           

【結果】

Java之路:基本資料類型的包裝類

調用compareTo方法對b1、b2進行比較,并将結果賦給res。如果僅b1為真,則res大于零,如果僅b2為真,則res小于零,否則res等于零。

5、Byte類

Byte 類将基本類型 byte 的值包裝在一個對象中。一個Byte類型的對象隻包含一個類型為 byte 的字段。此外,該類還為byte和String的互相轉換提供了幾種方法,并提供了處理byte時非常有用的其他一些常量和方法。如下:
Java之路:基本資料類型的包裝類
public class ByteFun {
	public static void main(String[] args) {
		byte b = 23;
		Byte b1 = new Byte(b),
			 b2 = Byte.valueOf("23"),
			 b3 = 12;
		int x1 = b1.intValue(),
			x2 = b2.intValue(),
			x3 = b3.intValue();
		System.out.println("b1:" + x1 + ", b2:" + x2 + ", b3:" + x3);
		String str1 = Byte.toString(b),
			   str2 = Byte.toString(b2),
			   str3 = b3.toString();
		System.out.println("str1:" + str1 + ", str2:" + str2 + ", str3:" + str3);
		byte bb = Byte.parseByte("23");	// 将String參數解析為有符号的十進制byte
		System.out.println("Byte.parseByte(\"23\"):" + bb);
		boolean bool1 = b1.equals(b2),
			 bool2 = b1.equals(b3);
		System.out.println("b1.equals(b2):" + bool1 + ", b1.equals(b3):" + bool2);
	}
}
           

【結果】

Java之路:基本資料類型的包裝類

(1)首先,對于new關鍵字建立的包裝類對象,兩次new得到的對象引用位址是不同的,不能使用 “==”關鍵字做大小比較。而使用“<”和“>”等運算符時,包裝類型會調用valueOf方法,将運算符兩邊的對象都轉換為基本類型後再做比較。這就是為何“==”*不能使用而“<”、“>”、“<=”、“>=”這幾個符号可以使用的原因。

(2)其次,使用valueOf方法建立的Integer對象,使用“==”符号時,運作結果有時候正确,有時候不正确。檢視valueOf方法的源碼,如下:

public static Integer valueOf(int i)
{
	if(i >= -128 && i <= IntegerCache.high)
	return IntegerCache.cache[i+128];
	else
	return new Integer(i);
}
           

通過看源碼能夠知道,整數類型在-128~127之間時,會使用緩存,如果已經建立了一個相同的整數,使用valueOf建立第二次時,不會使用new關鍵字,而用已經緩存的對象。

是以使用valueOf方法建立兩次對象,若對應的數值相同,且數值在-128~127之間時,兩個對象都指向同一個位址。

最後,使用Integer i = 400這樣的方式來建立Integer對象,與valueOf方法的效果是一樣的,不再贅述。

總之,包裝類對象不可使用“==”符做比較運算,如果要進行比較運算時,最好使用java類庫中的compareTo方法。