Java基礎總結(二)基本資料型別的引用
阿新 • • 發佈:2019-01-28
在上一篇文章中我們談到了引用,這篇文章我們就來談談引用在基本資料型別與其對應的包裝類應用與分析
先看看下面這段程式碼:
@Test
public void test() {
int a = 10;
int b = 10;
Integer c = 10;
Integer d = 10;
Integer e = new Integer(10);
Integer f = new Integer(10);
System.out.println("a == b: " + (a == b)); //①true
System.out.println("c == d: " + (c == d)); //②true
System.out.println("e == f: " + (e == f)); //③false
System.out.println("a == c: " + (a == c)); //④true
System.out.println("c == e: " + (c == e)); //⑤false
System.out.println("a == e: " + (a == e)); //⑥true
Integer m = 500 ;
Integer n = 500;
System.out.println("m == n: " + (m == n)); //⑦false
}
首先我們需要明白
①在方法區中,儲存的相同常量只能為一個
②只要是通過new,來建立引用的,都需要在堆記憶體建立新的空間
③==永遠是用來比較記憶體中的地址的,基本型別感覺上是在比較內容,實際上還是在比較地址
分析其引用過程:
①a,b為基本資料型別 ,堆中是不開闢記憶體的
當執行第一句程式碼時。先查詢方法區中有沒有10,沒有,則開闢一個空間存放10,然後在棧中存入一個變數 a,讓a指向10;
執行第二句的時候,查詢發現10已經存在了,所以就不開闢新空間了。直接在棧中儲存一個新變數b,讓b指向2;
②c,d為int的包裝類Interger
integer與integer比較的是引用的地址,並沒有在堆中開闢新空間(不用new的情況下)
③e,f為Interger,integer與integer比較的是引用的地址,均在堆中開闢新的空間,各空間不一樣
④a,c,一個為int,一個為Interger。首先Interger c先拆箱成int,再與a比較,此時c直接指向常量10,兩者的值(指向的記憶體地址)一樣。
這個分析同⑥
⑤c沒有開闢新的空間,e開闢了新的空間,兩者指向不一樣
⑦兩者均為Interger,但是為false。原因如圖:
總結,分析如圖: