1.1爲何須要容器?
在端與端之間的傳輸中,須要Java臨時存儲數據。數組
2.2 ArrayList就是一個簡單的類,咱們簡單的用數組實現ArrayList,先看一段代碼函數
首先:先執行MyArrayListUser
當看到new這個關鍵字的時候,首先先想到在堆內存中開闢了一塊存儲空間
注:有些方法區的位置存放於堆上,有些版本的方法區存放於堆外3d
既然是new出的對象,咱們直接看構造函數
對象
爲何底層要用數組實現呢?
同時咱們也能夠看一下ArrayList的源碼,他到底幹了什麼?blog
是的,ArrayList和String同樣底層也是數組實現的,惟一的區別是String底層是char[]數組,而這兒是Object[]數組
讀到這裏,小夥伴們應該有三大疑惑?
1:爲何底層要用數組,同時衍生到String字符串的底層爲何用數組
2:爲何底層要用Object數組
3:爲何我給他賦值給10接口
1:由於沒有別的實現方法
1.1:由於String不變性,數組只能存儲字符,數組的長度也是不可變的,若是相變只能擴容
2:由於Object類是全部類的基類,Object類是全部類的父類
3:不知道,之後再說內存
而這裏的Object[]數組,能夠存聽任何對象,執行完構造函數後ci
繼續執行:
oml.add("123");
oml.add("456");
oml.add("789");
字符串
很少說,看我們的源碼MyArrayList是怎麼處理add的。
哪瞭解數組是怎麼擴容的呢?擴多大呢?
我這裏用的是建立一個新數組,而後把內容擴兩倍,把新數組內容放入老數組中
將建立一個新數組,並將舊數組的內容複製過來。,那麼舊數組會在內存中仍是刪除後會發生什麼呢?
ArrayList釋放了對舊數組的引用,舊數組將會被GC回收
爲何擴容須要擴1.5倍呢?
這個問題留給觀衆
在ArrayList源碼中
這兒有一段代碼:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位運算符,至關於int newCapacity = oldCapacity + (oldCapacity/2),但性能會好一些。
傳遞的過程當中就是把obj的地址賦值給arr
一樣的,還有其餘ArrayList的方法,由於過於簡單因此就不敘述了