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;苹果正加速其在人工智能技术上的…

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…

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…

【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…

【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…

基于Python的人脸识别系统设计与实现(论文+源码)_kaic

基于Python的人脸识别系统设计与实现 摘 要 随着人工智能的发展,人脸识别系统在我们的生活中越来越被广泛应用。人脸识别系统是指能够从数字图像或视频源中识别人的技术。人脸识别系统可以通过多种方法工作&#xff0c;但是&#xff0c;它们通常是通过将给定图像中的面部特征与…

202012青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 运行下方代码段&#xff0c;输出是6&#xff0c;则输入的可能是&#xff08; &#xff09;。 a eval(input())print(a)A :8%2 B :8/2 C :3*2 D :3**2 正确答案:C 试题解析: 第 2 题 【单选题】 关于Python变量&#xff0c;下列叙述正确的是&#x…

Spring Cloud——LoadBalancer

Spring Cloud——LoadBalancer 一、负载均衡&#xff08;LoadBalance&#xff09;1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 二、LoadBalancer1.Spring RestTemplate as a LoadBalancer Client2.编码使用DiscoveryClient动态获取所有上线的服务列表3.从默认…

《自动机理论、语言和计算导论》阅读笔记:p215-p351

《自动机理论、语言和计算导论》学习第 11 天&#xff0c;p215-p351总结&#xff0c;总计 37 页。 一、技术总结 1.constrained problem 2.Fermat’s lats theorem Fermat’s Last Theorem states that no three positive integers a, b and c satisfy the equation a^n b…

过渡与动画

单元素/组件过渡 Vue在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的过渡效果&#xff08;一个淡入淡出的效果&#xff09; 在条件渲染&#xff08;使用v-if&#xff09;、条件展示&#xff08;使用v-show&#xff09;、动态组件、组件根节点等情形中&#xff0c;可…

python算法题

需求 代码 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if max(nums) >target:for i in range(len(nums)-1):if nums[i1] > target and nums[i] <target:return i1if max(nums) <target:return len(nums)if min(nums) > …

操作系统(2)——进程线程

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/8MJA9)基础概念线程详解进程详解进程间通信调度常用调度算法 重要问题哲学家进餐问题问题的描述策略 读者-写者问题问题的描述两种情况策略 总结进程线程一句话 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

240 基于matlab的飞行轨迹仿真程序

基于matlab的飞行轨迹仿真程序&#xff0c;多种不同的飞行轨迹&#xff0c;输出经度、纬度、高度三维轨迹&#xff0c;三个方向的飞行速度。程序已调通&#xff0c;可直接运行。 240 飞行轨迹仿真 三维轨迹 飞行速度 - 小红书 (xiaohongshu.com)

Golang图片验证码的使用

一、背景 最近在使用到Golang进行原生开发&#xff0c;注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现&#xff0c;发现了这个库用得还是蛮多的。并且支持很多类型的验证方式&#xff0c;例如支持数字类型、字母类型、音频验证码、中文验证码等等。 项目地…