基本資料型別與其包裝型別
---- 基本型別 與 包裝型別
Java 中預定義了八種基本資料型別,包括:byte,int,long,double,float,boolean,char,short。基本型別與物件型別最大的不同點在於,基本型別基於數值,物件型別基於引用。
基本型別的變數在棧的區域性變量表中直接儲存的具體數值,而物件型別的變數則儲存的堆中引用。顯然,相對於基本型別的變數來說,物件型別的變數需要佔用更多的記憶體空間。
---- 筆試結合
在jdk1.5以後,開始引入自動裝箱和拆箱的操作,例如:
public static void main(String[] args){
int age = 21;
Integer integer = age; //自動裝箱 相當於 Integer integer = new Integer(age);
int num = integer; //自動拆箱 相當於 int num = integer.intValue();
}
當然,拆裝箱是需要方法呼叫的,也就是需要棧幀的入棧出棧的,直白點說,就是耗資源,所以我們的程式中應當儘量避免大量的「拆裝箱」操作。
舉個栗子:
public static void main(String[] args){ Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); System.out.println(i3==i4); }
結果:
true false
分析:
這裡就要引入Integer類的 valueOf方法使用到一個叫 IntegerCache 的快取區,它能夠預設快取[-128,127] 之間的 Integer 例項,所以,當100在其快取區範圍內,會從中返回相應的值給i1,
Integer i2 = new Integer(100);
而第二個輸出「false」也是很好理解的,因為 200 不再快取池快取的範圍內,所以每次呼叫 valueOf 方法都會新建一個不同的 Integer 例項。
舉個栗子
public static void main(String[] args){ Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2); System.out.println(i3==i4); }
結果:
false false
分析:
因為在 Double 和 Float 中,沒有存在有快取區這個東西,這是因為就算給定任意一個區間,都無法確定這個區間裡面有多個double型別或者float型別的值。所以,它每一個 double 型數值包裝一個新的 Double 例項,如下:
public static Double valueOf(double d) { return new Double(d); }
舉個栗子
public class Test8 { public static void main(String[] args) { Integer i = 10; Integer a3 = 10; Float a = 10f; Double c = 10.0; int b = 10; float d = 10f; System.out.println(i == d); System.out.println(b == d); System.out.println(c == b); System.out.println(a.equals(d)); System.out.println(c.equals(i)); } }
結果:
true true true true false
分析:
這裡要需要了解一下在java中 “==” 和 equals()方法,“==”如果比較的兩者是基本數值的話,那麼比較的就是他們的值,而如果兩個都是物件變數的話,那麼比較的是他們的地址,而“equals()”方法,比較的是變數的值以及返回引數型別,所以,雖然變數a,c,b,d的數值型別不同,但是其本身的值都是相等,比較結果為true。
所以,Integer 型別物件 和 Double 型別物件 比較,雖然數值是相同的,但是兩者是不一樣的型別,所以為false。如下:
參考文章: 基本資料型別及包裝類