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);}}

模拟实现顺序表ArrayList1(三级)相关推荐

  1. java如何给顺序表赋值_JAVA模拟新增顺序表及单链表

    最近在回顾大学学的数据结构,这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序www.cppcns.com表 * * @author cjd * ...

  2. 模拟实现顺序表ArrayList2(三级)

    package com.learn.datastructure;/*** 线性接口表* 我怎么觉得这些方法我们都学过,* 是不是都学过,大同小异,* 注意这是一个接口,和存储结构无关* 无论是顺序表还 ...

  3. 【DS】3.顺序表链表万字全总结!

    文章目录 一.关于List 为什么要提List 什么是List List怎么用 二.关于线性表 三.关于顺序表 什么是顺序表 顺序表我们常用的功能: ArrayList的简化模拟实现: 四.Array ...

  4. JAVA顺序表的简单实现

    import java.util.Scanner;class DATA{ //模拟一个班级的学生记录String key;String name;int age;}class SLType{stati ...

  5. 顺序表应用8:最大子段和之动态规划法

    Description 给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的 ...

  6. C语言用数组(顺序表)实现大小固定的队列的方法

    顺序队列,即采用顺序表模拟实现的队列结构. 我们知道,队列具有以下两个特点: 1.数据从队列的一端进,另一端出: 2.数据的入队和出队遵循"先进先出"的原则: 因此,只要使用顺序表 ...

  7. 【JAVA】顺序表与ArrayList

    顺序表与ArrayList 顺序表与ArrayList 一.线性表 二.顺序表 接口的实现 三.ArrayList简介 四.ArrayList使用 1. ArrayList的构造 2. ArrayLi ...

  8. 【数据结构】顺序表和链表的优缺点

    1.顺序表 优点: 1.物理空间是连续的,方便使用下标随机访问. 缺点: 1.由于需要物理空间连续,空间不够需要扩容.扩容本身有一定消耗,其次扩容机制还存在一定的空间浪费. 2.头部或者中部的插入.删 ...

  9. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

最新文章

  1. redis链表link命令
  2. go http 处理w.write 错误_Go语言中的异常和错误处理简介
  3. 最优化理论与方法(part11)--约束优化问题
  4. android ios av tv,iOS使用AVPlayer制作战旗TvDEMO OC版
  5. 机器学习--弹性网络(Elastic-Net Regression)
  6. html 3d坐标,HTML3D
  7. <c++STL>: map的常见用法
  8. 火狐浏览器缓存区的利用,如何提取火狐缓存的动画
  9. 操作系统读写者问题实验报告_Linux操作系统存储子系统核心技术之硬盘与RAID
  10. xml样本标签转txt
  11. java垃圾回收的具体时间_JVM垃圾回收机制是怎样的,何时触发YoungGC或FullGC操作?...
  12. 正态总体均值的假设检验
  13. UDP视频流MP2T的分析方法
  14. Win7多用户下开机只显示一个用户
  15. 为什么国家将加快人工智能研究生培养?又为什么很多研究生评论人工智能是个大坑呢?...
  16. java开发用allman风格_缩进风格
  17. 2021年四川高考成绩及录取结果查询,2021年四川高考录取结果查询时间及查询入口,录取结果多少号公布...
  18. FMEA软件——你们的FMEA还“活着”吗?
  19. 智慧城市同城V4 v2.1.7 同城 同城小程序 同城信息
  20. msyql关于大于号和order by

热门文章

  1. 关于wordpress中更换CKEditor编辑器
  2. zigbee 常规配置
  3. 获得md5加密后的字符串
  4. 解决 Windows 和 Ubuntu 时间不一致的问题--转载
  5. Ansible剧本介绍及使用演示(week5_day2)--技术流ken
  6. FileEncodingApplicationListener使用以及原理
  7. 缓存依赖中cachedependency对象
  8. android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上...
  9. Cassandra - Insert after Delete fails silently
  10. postgresql数据库备份与还原