在上一節(jié)中,我們簡單闡述了Java的一些基礎知識,比如多態(tài),接口的實現等。 然后,演示了ArrayList的幾個基本方法。 ArrayList是一個集合框架,它的底層其實就是一個數組,這一點,官方文檔已經說得很清楚了。 作為一個容器,ArrayList有添加元素,刪除元素,以及獲取元素的方法。 本節(jié)我們先不看ArrayLis底層的源碼,而是按照平常的思路來模擬一下ArrayList的具體實現??纯慈绻覀冏约簛韺懙脑?,會怎么實現ArrayList的功能? #1. 新建一個MyList類 好的,我們來模擬一下ArrayList類,怎么模擬呢,是不是這樣就行了? ``` import java.util.ArrayList; public class MyList extends ArrayList{ } ``` 寫完了。 額,開個玩笑,別打我。。。 --- 好的,讓我們開始吧。 這個MyList類,主要用來模擬一下ArrayList的基本方法,我們新建一個MyList 類 ``` package jianshu; public class MyList { } ``` 現在的MyList是不是啥也沒有啊,就好像一個新生的嬰兒一樣,純潔得像一張白紙。 我們現在需要給MyList**添加一個新的身份**。 添加身份,不就是實現接口或者繼承某個類么? 原先的ArrayList因為繼承了List接口,所以必須實現List接口所有的抽象方法,我們?yōu)榱撕唵纹鹨姡筒蝗崿FList接口了。 我們來定義一個簡單的List接口,名字就叫做 SimpleList 吧。 里面定義幾個常用的抽象方法。 ``` package jianshu; /** * 簡單的List接口 * @author 剽悍一小兔 * */ public interface SimpleList { /** * 添加元素 * @param obj * @return boolean */ boolean add(Object obj); /** * 根據元素下標刪除元素 * @param index */ void remove(int index); /** * 根據元素下標獲取對應的元素 * @return Object */ Object get(int index); /** * 將當前的SimpleList轉換成Object數組 * @return Object[] */ Object[] toArray(); /** * 獲取當前列表中元素的個數 * @return int */ int size(); } ``` 現在,讓MyList實現這個接口。這步操作,就相當于給MyList添加一個新的身份。 因為MyList可以變身成為SimpleList,那么就必須擁有SimpleList的所有能力。 所以,我們是不是必須要實現SimpleList中所有的抽象方法呢? ``` package jianshu; public class MyList implements SimpleList{ public boolean add(Object obj) { return false; } public void remove(int index) { } public Object get(int index) { return null; } public Object[] toArray() { return null; } public int size() { return 0; } } ``` 接著,定義一個測試類,專門用來測試MyList ``` package jianshu; public class TestMyList { public static void main(String[] args) { } } ``` #2. 構造函數設計 ##2.1 容器選型 我們完全按照ArrayList的規(guī)范來,打開api,發(fā)現其實ArrayList不止一個構造方法。 ArrayList有三個構造方法,分別為 ArrayList() --- 空構造方法。 ArrayList(Collection c) --- 傳入參數為一個Collection對象。 ArrayList(int initialCapacity) --- 傳入參數為一個int類型的數字,initialCapacity表示容量,在ArrayList被new出來的時候就規(guī)定一下初始容量是多少。 我們知道,Java在定義數組的時候,必須有一個長度。 比如: ``` Object[] objs = new Object[3]; ``` 這樣我就定義了一個長度為3的數組。 這個是顯示定義的。 當然還可以這樣: ``` Object[] objs = new Object[]{1,2,3}; ``` 雖然沒有明確指出數組的長度是多少,但是我們都知道它的長度就是3,這屬于隱式定義。 我們的MyList本身沒有存儲數據的能力,為了讓它具備這方面的能力,是不是要給他定義一個屬性啊。 一個Java類,無非就是屬性和方法,大部分情況下,方法無非就是用來給屬性賦值的。 **屬性是干嘛用的,不就