✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉
🍎个人主页:再无B~U~G-CSDN博客
目标:
1. 什么是 List
2. List 常见接口介绍
3. List 的使用
本章主要学习顺序表底层逻辑,大致是一样的,不差多少。
1. 什么是List
在集合框架中,List是一个接口,继承自Collection。
Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:
Iterable 也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:
List 的官方文档
站在数据结构的角度来看, List 就是一个线性表,即 n 个具有相同类型元素的有限序列,在该序列上可以执行增删 改查以及变量等操作 。
【 面试题 】 Collection 中有那些方法?
2. 常见接口介绍
List中提供了好的方法,具体如下:
虽然方法比较多,但是常用方法如下:
方法 | 解释 |
boolean add (E e) | 尾插 e |
void add (int index, E element) | 将 e 插入到 index 位置 |
boolean addAll (Collection<? extends E> c) | 尾插 c 中的元素 |
E remove (int index) | 删除 index 位置元素 |
boolean remove (Object o) | 删除遇到的第一个 o |
E get (int index) | 获取下标 index 位置元素 |
E set (int index, E element) | 将下标 index 位置元素设置为 element |
void clear () | 清空 |
boolean contains (Object o) | 判断 o 是否在线性表中 |
int indexOf (Object o) | 返回第一个 o 所在下标 |
int lastIndexOf (Object o) | 返回最后一个 o 的下标 |
List<E> subList (int fromIndex, int toIndex) | 截取部分 list |
3.简单实现List顺序表的底层逻辑
目的:为了更加清楚的了解顺序表的使用
相应的级别关系:
把所有的顺序表方法都定义在IList接口:
这里不带多讲,结构上跟c语言差不多。
我们说一下异常这一块:
梳理一下异常的应用,比如说:
实现代码:
相应的解释代码里面都有:
src/arrayList/IList接口
package arrayList;public interface IList {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某个元素boolean contains(int toFind);// 查找某个元素对应的位置int indexOf(int toFind);// 获取 pos 位置的元素int get(int pos);// 给 pos 位置的元素设为 value -> 更新void set(int pos, int value);//删除第一次出现的关键字keyvoid remove(int toRemove);// 获取顺序表长度int size();// 清空顺序表void clear();// 打印顺序表,// 注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的void display();
}
src/arrayList/MyArrayList类
package arrayList;import java.util.Arrays;public class MyArrayList implements IList {public int[] elem;public int usedSize;//调用构造方法,初始化顺序表长度public MyArrayList() {this.elem = new int[2];}//判断顺序表满不满public boolean isFull() {return elem.length == usedSize;}//添加一个元素@Overridepublic void add(int data) {if (isFull()) {elem = Arrays.copyOf(elem, 2 * elem.length);}this.elem[usedSize] = data;this.usedSize++;}//该方法来 判断 添加元素时 pos是否合法private void checkPosOfAdd(int pos) throws PosNotLegalException {if (pos < 0 || pos > usedSize) {throw new PosNotLegalException("pos位置不合法!");}}// 在 pos 下标位置新增元素@Overridepublic void add(int pos, int data) {//判断是不是正确引用try {checkPosOfAdd(pos);} catch (PosNotLegalException e) {e.printStackTrace();}if (isFull()) {//扩容elem = Arrays.copyOf(elem, 2 * elem.length);}//移动元素for (int i = usedSize - 1; i >= pos; i--) {elem[i + 1] = elem[i];}//插入元素this.elem[pos] = data;this.usedSize++;}//判断顺序表是否有改元素@Overridepublic boolean contains(int toFind) {for (int i = 0; i < usedSize; i++) {if (this.elem[i] == toFind) {return true;}}return false;}//查找某个元素对应的下标位置@Overridepublic int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if (this.elem[i] == toFind) {return i;}}return -1;}//判断pos位置是否合法private void checkPosOfGetAndSet(int pos) throws PosNotLegalException{if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("get/set获取元素的时候" +"pos位置不合法!");}}// 获取 pos 位置的元素@Overridepublic int get(int pos) {//判断pos位置是否合法try {checkPosOfGetAndSet(pos);}catch (ClassCastException e){e.printStackTrace();}return this.elem[pos];}// 给 pos 位置的元素设为 value -> 更新@Overridepublic void set(int pos, int value) {//判断pos位置是否合法try {checkPosOfGetAndSet(pos);}catch (ClassCastException e){e.printStackTrace();}this.elem[pos] = value;}//删除第一次出现的关键字key@Overridepublic void remove(int toRemove) {//1、要查找是否存在要删除的关键字 toRemoveint pos = indexOf(toRemove);if(pos == -1) {System.out.println("没有要删除的数字!");return;}for (int i = pos; i < usedSize-1; i++) {elem[i] = elem[i+1];}usedSize--;}//返回数据长度@Overridepublic int size() {return this.usedSize;}//释放顺序表@Overridepublic void clear() {this.elem = null;this.usedSize = 0;}//打印顺序表@Overridepublic void display() {System.out.print("[ ");for (int i = 0; i < usedSize; i++) {System.out.print(elem[i] + " ");}System.out.println("]");}
}
src/arrayList/PosNotLegalException类
package arrayList;public class PosNotLegalException extends RuntimeException{//不带参数的构造方法public PosNotLegalException() {}//带参数的构造方法public PosNotLegalException(String msg) {super(msg);}}
src/arrayList/Test测试类
package arrayList;public class Test {public static void main(String[] args) {MyArrayList list = new MyArrayList();list.add(1);list.add(2);list.add(3);list.add(4);// list.add(1,24);
// boolean temp = list.contains(24);
// if(temp){
// System.out.println("有");
// }else{
// System.out.println("没有");
// }// 打印链表list.display();
// int is =list.indexOf(2);
// if (is >= 0) {
// System.out.println("有,在下标:" + is);
// } else {
// System.out.println("没有");
// }// 获取 pos 位置的元素
// int a = list.get(3);
// System.out.println(a);
// list.set(2, 6);
// System.out.println(a);list.remove(3);// 打印链表list.display();}
}
今天就到这里了,感谢观看。