1. 程式人生 > >java 集合中物件型別(個人見解)

java 集合中物件型別(個人見解)

先貼出面試題

以下程式碼執行結果是什麼。

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()實際物件型別。
  • 集合之間賦值是將地址傳遞,並不是複製一個集合過去。