ArrayList的數組簡單實現

  1. 容器是什麼?
    簡單來講容器至關於一個Box,其中的List、Set、Queue和Map這些基本類型,方便在容器內進行反覆存刪的操做

1.1爲何須要容器?
在端與端之間的傳輸中,須要Java臨時存儲數據。數組

  1. ArrayList的初始化
    2.1 ArrayList和List的區別:
    List是一個接口,ArrayList是List的一個實現類

2.2 ArrayList就是一個簡單的類,咱們簡單的用數組實現ArrayList,先看一段代碼函數

首先:先執行MyArrayListUser oml = new MyArrayListUser<>(); MyArrayListUser是我手動實現的ArrayList
當看到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的方法,由於過於簡單因此就不敘述了

相關文章
相關標籤/搜索