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

網(wǎng)友評(píng)論