裝箱:在值類型向引用類型轉換時發生;
拆箱:在引用類型向值類型轉換時發生;
值類型:直接將內存存儲在棧內,由系統自動釋放資源的數據類型;
引用類型:由類型的實際值引用(類似於指針)表示的數據類型,通俗點說就是在編程時需要new出來的變量類型都是引用型,引用類型是存放在內存的堆中;
內存堆跟棧的定義跟數據結構的堆棧是不同的,
棧:由大至小的分配,先進后出,直接存放值類型的地方;我們一般出現的內存溢出就是由於棧位都分配完了;
堆:由小至大的分配,隨意存儲,存放引用類型的地方;
List接口是一個有序集合,其元素以線性方法存儲,集合中允許存放重復的元素。
Array類實現List接口,可以直接通過ArrayList為List接口實例化。ArrayListl類是數組列表類,實現了可變長度的數組。 List是一個接口,而ArrayList是List接口的一個實現類。
ArrayList類繼承並實現了List接口。
因此,List接口不能被構造,也就是我們說的不能創建實例對象,但是我們可以像下面那樣為List接口創建一個指
向自己的對象引用,而ArrayList實現類的實例對象就在這充當了這個指向List接口的對象引用。
由於ArrayList的每個item默認是Object的類型,所以當我們執行語句list.add(1);的時候,就是做了一次裝箱的操作。同理,在for循環里list的每一項都要做一個拆箱的操作才能得到變量i,最后到打印變量i時,由於字符串也是引用類型,所以也要做一次的裝箱的操作。這里前后一共做了6次的裝箱拆箱(4次裝箱,2次拆箱),每一次的裝箱拆箱都涉及CPU以及內存的分配,都是性能的損耗。
由於List使用了泛型,我們指定了item必需是int類型,所以在add item的時候,不需要再進行裝箱拆箱的操作,一直到打印i的時候,才需要做裝箱的操作,整段代碼執行完以后,一共才進行2次的裝箱拆箱(2次裝箱,0次拆箱)。
如果List的item多,程序運行時,相對於ArrayList來說就會節省很多的系統資源。所以List與ArrayList的使用區別,到最后就是性能的表現問題。
