java 集合中物件型別(個人見解)
阿新 • • 發佈:2018-12-21
先貼出面試題
以下程式碼執行結果是什麼。
public class Test { public static void main(String args[]) { List Listlist1 = new ArrayList(); Listlist1.add(0); List Listlist2 = Listlist1; System.out.println(Listlist1.get(0) instanceof Integer); System.out.println(Listlist2.get(0) instanceof Integer); } }
結果:
true
true
解析
1.instanceof
instanceof是用來判斷是否屬於某個型別
2.基本型別的自動裝箱
由於collection只能裝入物件型別的資料,0是一個基本資料型別,在jdk1.5之前是不能裝入collection中的,但是在jdk1.5之後加入了自動裝箱與拆箱,在Listlist1.add(0);程式碼執行的時候回自動將0轉化成Integer型別的物件放入集合中。
3.集合中物件的型別
在執行Listlist1.add(0);語句時,自動裝箱操作將0轉為Integer放入ArrayList中,由於沒有指定泛型,所以ArrayList會將0以Object的形式在集合中儲存, 執行List Listlist2 = Listlist1;時,將Listlist1指標指向的地址賦給Listlist2,他們指向的是同一塊堆記憶體空間。 當執行Listlist1.get(0) instanceof Integer時,相當於先從集合中取出編號為0的資料,由於沒有指定泛型,系統根據Listlist1.get(0).getClass()拿到資料的實際型別java.lang.Integer再和Integer進行判斷。所以結果都是true。
結論
- 集合不能裝入基本型別資料,jdk1.5之後在裝入基本型別資料時會自動包裝成相應的物件型別。
- 集合在底層都是以object物件來儲存資料的,在取出資料時會將資料轉化為指定泛型的型別,如果不指定泛型,則會轉化成object.getClass()實際物件型別。
- 集合之間賦值是將地址傳遞,並不是複製一個集合過去。