JAVASE->数据结构|顺序表底层逻辑

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:再无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();}
}

今天就到这里了,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类&#xff0c;它继承了AbstractOwnableSynchronizer&#xff0c;实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

信号与线性系统 1绪论

信号 信号是随时间变化的某种物理量&#xff08;狭义&#xff09; 本课程中&#xff0c;信号用 函数&#xff08;而且是一维函数&#xff09;表示 连续 离散 信号分类 确定与随机&#xff1a;是否能以确定的时间函数表示离散与连续&#xff1a;是用全体实数还是特定整数来描述…

普乐蛙景区vr体验馆VR游乐场设备身历其境体验

小编给大家推荐一款gao坪效产品【暗黑战车】&#xff0c;一次6人同乘&#xff0c;炫酷外观、强大性能和丰富内容适合各个年龄层客群&#xff0c;紧张刺激的VR体验让玩家沉浸在元宇宙的魅力中&#xff0c;无论是节假日还是平日&#xff0c;景区商场助力门店提高客流量和营收~ ◆…

苹果和OpenAI再续前缘,iOS 18会是颠覆级的吗?|TodayAI

据彭博社最新报道&#xff0c;苹果公司已经与人工智能领域的先锋企业OpenAI重启了对话&#xff0c;双方目前正在讨论一项可能的合作&#xff0c;以将OpenAI的生成式人工智能技术整合到苹果即将推出的iOS 18操作系统中。这一举措表明&#xff0c;苹果正加速其在人工智能技术上的…

Acwing 818. 数组排序

给定一个长度为 n n n的数组 a a a以及两个整数 l l l和 r r r&#xff0c;请你编写一个函数&#xff0c;void sort(int a[], int l, int r)&#xff0c;将 a [ l ] ∼ a [ r ] a[l]∼a[r] a[l]∼a[r]从小到大排序。 输出排好序的数组 a。 输入格式 第一行包含三个整数 n &…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

小米消金持续发力,全面强化金融消费者权益保护措施

近年来&#xff0c;电信网络欺诈手段层出不穷&#xff0c;深度伪造等互联网技术被误用&#xff0c;导致欺诈行为更加隐蔽。重庆小米消费金融有限公司&#xff08;以下简称“小米消金”&#xff09;&#xff0c;作为一家持牌消费金融公司&#xff0c;深知保护消费者财产安全的重…

AI手机,走入小径分岔的花园

博尔赫斯在他的成名作《小径分岔的花园》里&#xff0c;描述了一种奇妙的世界观&#xff1a;一个可能性被选择之后&#xff0c;出现了许多不同的后世&#xff0c;许多不同的时间。 在现实世界中&#xff0c;选择不会如此神奇。但站在岔路口的抉择&#xff0c;也一定会带来结果的…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接&#xff1a; 角色&#xff1a;系统管理员 是否拥有权限&#xf…

实验七 SJK数据库定义与操纵

实验题目 实验七 SJK数据库定义与操纵 实验时间 2023.5.17 实验地点 软件工程基础实验室 实验课时 2 实验目的 ​了解并掌握数据库定义与操纵的知识并能熟练应用 实验要求 ​熟练掌握和使用PL-SQL建立数据库基本表&#xff0c;使用PL/SQL developer操作数据库&a…

C++:现代类型转换

C&#xff1a;现代类型转换 C/C的旧式类型转换C的现代类型转换静态类型转换 static_cast重新解释转换 reinterpret_cast常量类型转换 const_cast动态类型转换 dynamic_cast C/C的旧式类型转换 在C语言中&#xff0c;类型转换被分为显式和隐式&#xff0c;常见的类型转换如下&a…

移动应用开发:Android vs iOS平台的选择与挑战

在移动应用开发领域&#xff0c;选择开发平台是一个关键的决策&#xff0c;通常涉及考虑Android和iOS这两大主流平台。每个平台都有其特定的优势和挑战&#xff0c;开发者需要根据目标市场、预算、功能需求和技术能力来做出选择。 ### Android和iOS的主要差异 1. **市场份额*…

C语言-预处理

一、C语言编译过程 预处理、编译、汇编、链接 1&#xff1a;预编译 将.c 中的头文件展开、宏展开 生成的文件是.i文件 2&#xff1a;编译 将预处理之后的.i 文件生成 .s 汇编文件 3、汇编 将.s汇编文件生成.o 目标文件 4、链接 将.o 文件链接成目标文…

es优化实践(es升级带来的大坑)->问题与痛点->优化过程->原理分析->最佳实践

这里分享一个ES2.X升级到ES5.X带来的天坑问题 结论先行 先上结论(最佳实践) es5以后版本 对于某个字段 1.字段用于terms查询,则字段定义为keyword类型, 如果定义为数值类型(number,long,short等)会有严重的性能问题 ,查询耗时会很长2.字段用于range查询,则字段定义为数值类型…

网络协议安全:SYN Flood原理和防御措施,使用hping3实现SYN Flood

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

【Docker】docker部署lnmp和搭建wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

google chromeDriver 地址

#chrome driver 下载地址 https://getwebdriver.com/chromedriver #chrome brower下载地址 https://googlechromelabs.github.io/chrome-for-testing/ centos 安装的dockerFile的部分命令&#xff1a; #安装browser wget https://dl.google.com/linux/chrome/rpm/stable/x86_…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的&#xff0c;后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…

Mac no library called “libcairo-2“ was found

最近在运行ernibe-bot researcher的时候出现了下面的问题&#xff1a; OSError: no library called "cairo-2" was found no library called "cairo" was found no library called "libcairo-2" was found cannot load library libcairo.so.2: …