模拟实现顺序表ArrayList1(三级)

package com.learn.datastructure;/*** 线性接口表* 我怎么觉得这些方法我们都学过,* 是不是都学过,大同小异,* 注意这是一个接口,和存储结构无关* 无论是顺序表还是链表,都要把这些功能给我实现,* 首先我们来讲顺序表啦,* @author Leon.Sun**/
public interface List {// 返回线性表的大小,即数据元素的个数。/*** 线性表里又几个元素* @return*/public int size();// 返回线性表中序号为 i 的数据元素/*** 获取第i个元素* @param i* @return*/public Object get(int i);// 如果线性表为空返回 true,否则返回 false。/*** 线性表是不是空的,* @return*/public boolean isEmpty();// 判断线性表是否包含数据元素 e/*** 线性表是不是包括某个元素* 是不是查找* @param e* @return*/public boolean contains(Object e);// 返回数据元素 e 在线性表中的序号/*** 某个元素在线性表的索引* @param e* @return*/public int indexOf(Object e);// 将数据元素 e 插入到线性表中 i 号位置/*** 添加* 这是加到指定位置,线性表的插入操作* @param i* @param e*/public void add(int i, Object e);// 将数据元素 e 插入到线性表末尾/*** 这两个添加有什么区别,* 这是加到最后,又插入就有添加* @param e*/public void add(Object e);// 将数据元素 e 插入到元素 obj 之前/*** 在谁谁之前加* @param obj* @param e* @return*/public boolean addBefore(Object obj, Object e);// 将数据元素 e 插入到元素 obj 之后/*** 在谁谁之后加* 这个大家自己都可以来写* @param obj* @param e* @return*/public boolean addAfter(Object obj, Object e);// 删除线性表中序号为 i 的元素,并返回之/*** 删除第几个,这是删除第几个元素* 比如我删除第5个元素* @param i* @return*/public Object remove(int i);// 删除线性表中第一个与 e 相同的元素/*** 删除指定值的元素* 比如我删除值是30的元素* @param e* @return*/public boolean remove(Object e);// 替换线性表中序号为 i 的数据元素为 e,返回原数据元素/*** 修改,把第几个元素改成新的值* @param i* @param e* @return*/public Object replace(int i, Object e);}
package com.learn.datastructure;/*** 这个类我们学过,叫ArrayList,实现List,可不能导包啊* 我们写的是自己的,不是JAVA的,是我们的,这不能导包* 我们来模拟一下JAVA的,怎么不对,方法没实现* 添加没有实现的方法,顺序表,底层采用的是数组,但是长度可以动态的变化* * @author Leon.Sun**/
public class ArrayList implements List {/*** 我们把它从JDK的List源代码拿过来,* 我们写上一个private,底层是一个数组,Object类型什么都可以放* 但是数组的长度有没有确定,没有确定,目前还没有确定长度,* */private Object[] elementData;/*** size什么意思,是不是数组的长度,不是,* 不是数组分配了几个空间,你数组分配了10个空间,* 可是我一个元素也没有放,而是元素的个数,* 然后我们再来写一个构造方法*/private int size;/*** 我们再增加一个构造方法,* 有没有指定数量,有没有指定数组的长度,没有,* 那我们这里面该怎么办呢,那思路方法多了去了,比如说可以调用this(4)*/public ArrayList() {/*** 告诉我这什么意思,我们点他一下跳到这里了,* 没有指定长度,默认长度就是4,这样总可以吧,* 这是一种策略,当然还有一种策略是什么,* 你要是有4个的话,加前4个的话是有空间的,加第5个就不行了* 我们不在这里纠结*/this(4);/*** 你也可以这么来指定* 没有指定长度,长度是0* 就是一个元素也没有,那种方式都行* */// elementData = new Object[] {};}/*** 构造方法,initialCapacity这个单词什么意思* 是初始的长度,就是我们使用这个构造方法呢,可以指定一个初始长度,* 你想让数组的初始长度是几,initialCapacity指定数组的初始长度* 长度是10,我们该怎么办* @param initialCapacity*/public ArrayList(int initialCapacity) {/*** 根据initialCapacity这个长度给initialCapacity分配空间* 给数组分配空间,分配指定数量的空间,本来elementData他是没有空间的,* 现在是不是有空间了,*/elementData = new Object[initialCapacity];/*** size应该是几,size不是initialCapacity,* 0还不如不写呢,本来就是0,指定顺序表的元素个数,默认是0,* 干脆不用写,初始值本来就是0,*/// size = 0;}/*** 这里size是0,是还没有写呢,* 我们的size该怎么办,长度是几,*/@Overridepublic int size() {/*** 直接返回size就行了* 因为你每次增加一个元素就加1*/return size;}/*** get比较简单,我想找到第几个元素,* 我想找到索引是几的元素,按照索引来找* 按照索引来找不是*/@Overridepublic Object get(int i) {/*** 我们加一个判断* 如果i小于0或者i大于等于size,如果在这个范围里面就是错误的* 我们把这条语句注释了,* 我们能不能来一个 java.lang.ArrayIndexOutOfBoundsException:这种异常* 有什么不可以的吗* 我们创建一个类MyArrayIndexOutOfBoundsException我的数组指针越界异常*/
//		if(i<0 || i>=size) {
//			/**
//			 * 这个时候就要抛异常了
//			 * 我们这里写的比较假,我们这里叫RuntimeException,
//			 * 我们能不能来一个索引越界异常,
//			 */
//			throw new RuntimeException("数组索引越界异常:" + i);
//		}if(i<0 || i>=size) {/*** throw这个异常就可以了*/throw new MyArrayIndexOutOfBoundsException("数组索引越界异常:" + i);}return elementData[i];}/*** isEmpty是永远返回false,* isEmpty返回谁,怎么就不是空的了,就看这个size等于0*/@Overridepublic boolean isEmpty() {/*** size等于0就是空的,不等于0就不是空的* 指向这一条语句,*/return size==0;}@Overridepublic boolean contains(Object e) {return false;}@Overridepublic int indexOf(Object e) {return 0;}@Overridepublic void add(int i, Object e) {}/*** 还有一个关键这个add有没有写过,add从来没有写过* 所以你加什么也相当于什么也没有做,你告诉我我怎么把元素加进去* 这是添加到最后的,你告诉我该怎么办,*/@Overridepublic void add(Object e) {/*** 底层是一个数组,我默认的分配了4个空间,* 就给我们这个数组elementData赋值* add永远是最后,写size,size初始值是0* 把元素放在数组最后的一个位置,给数组赋值*/elementData[size] = e;/*** 再来一个size++,元素个数加1,我们可以把这两个语句合在一起* 然后数量加1了,这个时候我们来做一个操作了*/size++;/*** 这样就合在一起了*/// elementData[size++] = e;}@Overridepublic boolean addBefore(Object obj, Object e) {return false;}@Overridepublic boolean addAfter(Object obj, Object e) {return false;}@Overridepublic Object remove(int i) {return null;}@Overridepublic boolean remove(Object e) {return false;}@Overridepublic Object replace(int i, Object e) {return null;}}
package com.learn.datastructure;public class TestArrayList {/*** * @param args*/public static void main(String[] args) {/*** 请问这个List是哪一个,是我们的还是JAVA的,是我们的,* 你没有导包,他优先采用当前包,我们导入JAVA的包然后进入看* transient Object[] elementData* 发现底层是数组,*/// java.util.ArrayList list;/*** 好我们之前都是这么来写的,好像我们从来都不写数,* 不写数怎么办,*/List list = new ArrayList();/*** 我要是把这里面的都注释了,长度是0,是空的,* 是不是就这么实现了,这底层也是这么一个一个来实现的*/list.add(123);list.add(321);list.add(456);/*** 如果把这个注释了,长度是3,不是空的*/list.add(678);/*** 因为你默认的长度是4,加4个没有问题,* 但是你加5个的时候就越界了*/// list.add(789);/*** 我现在想做一个操作,* 你说我现在执行会不会报错,没有报错* 他没有报错,我想输出一下* size()他的长度是几,长度是0,* 这结果让我好纳闷* * 现在长度是4,*/System.out.println(list.size());/*** 它是空的吗,不是空的* * 不是空的*/System.out.println(list.isEmpty());/*** 2实际上是想要456,看看是不是,是null* 索引2的456,*/System.out.println(list.get(2));/*** 索引是0的,123*/System.out.println(list.get(0));/*** 索引是8的,越界* 数组索引越界异常:8* com.learn.datastructure.MyArrayIndexOutOfBoundsException: 数组索引越界异常:8* 是这个异常,*/System.out.println(list.get(8));}}
package com.learn.datastructure;/*** 这个叫自定义异常,他要继承RuntimeException* 这里面也非常的简单,只要实现两个构造方法,* 我们要一个无参的,和一个带有异常信息的* @author Leon.Sun**/
public class MyArrayIndexOutOfBoundsException extends RuntimeException {public MyArrayIndexOutOfBoundsException() {super();}public MyArrayIndexOutOfBoundsException(String message) {super(message);}}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部