在上一节中,我们简单阐述了Java的一些基础知识,比如多态,接口的实现等。 然后,演示了ArrayList的几个基本方法。 ArrayList是一个集合框架,它的底层其实就是一个数组,这一点,官方文档已经说得很清楚了。 作为一个容器,ArrayList有添加元素,删除元素,以及获取元素的方法。 本节我们先不看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接口所有的抽象方法,我们为了简单起见,就不去实现List接口了。 我们来定义一个简单的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的规范来,打开api,发现其实ArrayList不止一个构造方法。 ArrayList有三个构造方法,分别为 ArrayList() --- 空构造方法。 ArrayList(Collection c) --- 传入参数为一个Collection对象。 ArrayList(int initialCapacity) --- 传入参数为一个int类型的数字,initialCapacity表示容量,在ArrayList被new出来的时候就规定一下初始容量是多少。 我们知道,Java在定义数组的时候,必须有一个长度。 比如: ``` Object[] objs = new Object[3]; ``` 这样我就定义了一个长度为3的数组。 这个是显示定义的。 当然还可以这样: ``` Object[] objs = new Object[]{1,2,3}; ``` 虽然没有明确指出数组的长度是多少,但是我们都知道它的长度就是3,这属于隐式定义。 我们的MyList本身没有存储数据的能力,为了让它具备这方面的能力,是不是要给他定义一个属性啊。 一个Java类,无非就是属性和方法,大部分情况下,方法无非就是用来给属性赋值的。 **属性是干嘛用的,不就

网友评论