【数据结构】从顺序表到ArrayList类

news2024/11/25 16:34:24

在这里插入图片描述

文章目录

  • 1.线性表
    • 1.1线性表的概念
    • 2.顺序表
    • 2.1顺序表的概念
    • 2.2顺序表的实现
    • 2.3接口的实现(对数组增删查改操作)
      • 3.ArrayList简介
        • 4. ArrayList使用
    • 4.1ArrayList的构造
    • 4.2 ArrayList的方法
    • 4.3 ArrayList的遍历

1.线性表

1.1线性表的概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
如图所示:
在这里插入图片描述

2.顺序表

2.1顺序表的概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.2顺序表的实现

因为顺序表存储数据是在一段连续的物理地址依次存储的线性结构,我们一般采用数组的形式来进行存储,通过在数组中完成数据的增删查改的操作。
2.2.1数组的创建

public class MyArrayList {
//定义一个未被初始化的数组elem
    public int[] elem;
    //定义一个记录该数组存了多少容量
    public int size;
    //将该容量设置为一个常量,为了到后面调构造方法的时候初始化数组的大小
    public static final int DEFAULT_CAPACITY = 5;
    //调用构造函数的时候初始化数组的大小,而size成员变量不需要初始化,因为一开始未被初始化,默认初始化为0.
    public MyArrayList() {
        this.elem = new int[DEFAULT_CAPACITY];
    }
}

2.2.2提供一些接口

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);
    //删除第一次出现的关键字key
    void remove(int toRemove);
    // 获取顺序表长度
    int size();
    // 清空顺序表
    void clear();
    //打印这个数组的内容
     void display();
     //判断是否空间满了
    boolean isFuul();
    boolean isEmpty();
}

2.2.3提供一些异常类
1.判断数组中是否为空的异常
2.判断下标是否合法的异常

//1.判断数组中是否为空的异常
public class EmptyException extends RuntimeException{
    public EmptyException() {
    }
    public EmptyException(String message) {
        super(message);
    }
}
//2.判断下标是否合法的异常
public class PosException extends RuntimeException{
    public PosException() {
    }
    public PosException(String message) {
        super(message);
    }
}

2.3接口的实现(对数组增删查改操作)

2.3.1 新增元素,(默认在数组最后新增)

 //往最后位置插入数据
    public void add(int data) {
        //判断空间是否满了,如果满了就扩容2倍
        if(isFuul()) {
            elem = Arrays.copyOf(elem,2*elem.length);
            System.out.println("扩容成功");
        }
        elem[size] = data;
        size++;
    }
    @Override
    public boolean isFuul() {
        return size == elem.length;
    }

2.3.2打印数组全部内容

//打印数组全部内容
    @Override
    public void display() {
        for (int i = 0; i < size; i++) {
            System.out.println(elem[i]);
        }
    }

2.3.3在 pos 位置新增元素

 // 在 pos 位置新增元素
    @Override
    public void add(int pos, int data) {
        //判断pos是否合法
        checkPosOfAdd(pos);
        //判断是否需要扩容
        if(isFuul()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        //最后在pos位置插入新元素
        for(int i=size-1;i>=pos;i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        size++;
    }
    //判断pos是否合法的方法,在顺序表中插入数据的时候,插入的位置前面必须要有数据。
    private void checkPosOfAdd (int pos) {
        if(pos<0 || pos>size) {
            throw new PosException("pos的位置不合法:"+pos);
        }
    }

2.3.4判定是否包含某个元素

// 判定是否包含某个元素
    //直接遍历数组然后一一和目标元素比较,有就返回true,没有就返回false。
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i< elem.length;i++) {
            if(toFind == elem[i]) {
                return true;
            }
        }
        return false;
    }

2.3.5查找某个元素对应的位置

// 查找某个元素对应的位置
    //直接遍历数组然后一一和目标元素比较,有就返回对应的下标,没有就返回-1。
    @Override
    public int indexOf(int toFind) {
        for(int i=0;i< elem.length;i++) {
            if(toFind == elem[i]) {
                return i;
            }
        }
        return -1;
    }

2.3.6 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素

// 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素
    @Override
    public int get(int pos) {
        //判断pos位置是否合法
        checkPosOfGet(pos);
        //判断这个顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        return elem[pos];
    }

2.3.7判断顺序表是否为空

 //判断顺序表是否为空
    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    //判断pos合不合法的方法
    private void checkPosOfGet (int pos) {
        if(pos<0 || pos>size) {
            throw new PosException("pos的位置不合法:"+pos);
        }
    }

2.3.8给 pos 位置的元素设为 value

 // 给 pos 位置的元素设为 value
    @Override
    public void set(int pos, int value) {
        //判断pos是否合法
        checkPosOfSet(pos);
        //判断顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        //修改pos位置的内容
        this.elem[pos] = value;
    }
    private void checkPosOfSet (int pos) {
        if (pos < 0 || pos > size) {
            throw new PosException("pos的位置不合法:" + pos);
        }
    }

2.3.9删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。

//删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。
    @Override
    public void remove(int toRemove) {
        //判断顺序表中是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        //找到我们需要删的这个数
        int indexof = indexOf(toRemove);
        for(int i = indexof;i<size-1;i++) {
            elem[i] = elem[i+1];
        }
        size--;
    }

2.3.10获取顺序表长度 直接返回size

// 获取顺序表长度 直接返回size
    @Override
    public int size() {
        return this.size;
    }

2.3.11清空顺序表

// 清空顺序表
    @Override
    public void clear() {
         size = 0;
    }

3.ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
【说明】

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
4. ArrayList使用

4.1ArrayList的构造

1.ArrayList() 无参构造:

List<Integer> list1 = new ArrayList<>();

2.ArrayList(int initialCapacity)指定顺序表初始容量:

List<Integer> list2 = new ArrayList<>(5);

3.ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList:相当于传入其他的ArrayList顺序表,使得这个顺序表的大小容量与数据类型和传入的顺序表是一致的。

List<Integer> list3 = new ArrayList<>(list2);

4.2 ArrayList的方法

4.2.1尾插法

public static void main(String[] args) {
        List<Integer> list2 = new ArrayList<>(5);
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);
        list2.add(5);
        System.out.println(list2);
    }

结果显示:
在这里插入图片描述
4.2.2将目标值插到指定index位置

 list2.add(1,6);
        System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.3删除 index 位置元素

 list2.remove(2);
        System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.4获取下标 index 位置元素

System.out.println(list2.get(3));

结果显示:
在这里插入图片描述

4.3 ArrayList的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach。
1.for循环+下标:

 public static void main(String[] args) {
        List<Integer> list2 = new ArrayList<>(5);
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);
        list2.add(5);
        for (int i = 0; i < list2.size(); i++) {
            System.out.print(list2.get(i)+" ");
        }
    }

结果显示:
在这里插入图片描述
2.foreach:

public static void main(String[] args) {
        List<Integer> list2 = new ArrayList<>(5);
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);
        list2.add(5);
        System.out.println("foreach循环下:");
        for (Integer integer:list2) {
            System.out.print(integer+" ");
        }
    }

结果显示:
在这里插入图片描述
最后,ArrayList是一个动态类型的顺序表,不够空间会自动扩容。

好久没更新了,在这我向我的老铁们道个歉,从今天开始更新关于java的数据结构的内容,希望大家多多支持。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

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

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

相关文章

VsCode容器开发 - VsCode连接远程服务器上的docker

VsCode容器开发 - VsCode连接远程服务器上的docker 前言 之前在服务器上的Docker内开发&#xff0c;文件编辑起来就很不爽。不如使用VsCode直接打开远程服务器上的Docker&#xff0c;这样就能在VsCode里直接无缝编辑Docker里的文件了。 但是百度和必应得到的中文结果都很奇葩…

【数学笔记】集合及简要逻辑

集合 基础简要逻辑集合间的关系与运算 基础 集合定义&#xff1a;把一些能够确定的不同对象组成的整体叫做一个集合&#xff0c;每个对象叫做元素。集合记法&#xff1a;一般用大写字母 A , B , C . . . . . . A,B,C...... A,B,C......表示集合&#xff0c;小写字母 a , b ,…

Python __repr__()方法:显示属性

先看下面程序&#xff1a; class Item:def __init__ (self, name, price):self.name nameself.price price # 创建一个Item对象&#xff0c;将之赋给im变量 im Item(鼠标, 29.8) # 打印im所引用的Item对象 print(im) 上面程序创建了一个 Item 对象&#xff0c;然后使用 prin…

Linux中NFS服务器的搭建和安装

1.介绍&#xff1a; 网络文件系统即将本地系统放在网络上某一个位置的系统&#xff0c;基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享&#xff0c;能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样&#xff0c;也就是说放在一个开发板上&#…

8.Gateway服务网关

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

python random.randint方法底层分析及其逆向

本文主要解释了python random模块中的randint方法的底层原理&#xff0c;并做了简单的逆向&#xff0c;能还原出所使用的随机数的部分&#xff0c;这在对random模块逆向的时候会有一些帮助。 文章目录 random模块底层原理概述randint分析逆向 random模块底层原理概述 python的…

C++版QT:鼠标事件

鼠标常用的事件可以说有一下几种&#xff1a;鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。 当你想使用他们&#xff0c;需要包含头文件&#xff1a;#include <QMouseEvent> 需要对鼠标事件进行处理时&#xff0c;通常要重新实现以下几个鼠标事件处理函数&a…

一文教你写出高效的软件测试用例!微信朋友圈动态发送为例

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

单元测试报Command line is too long. Shorten command line for XXXXX.XXX

文章目录 前言单元测试报Command line is too long. Shorten command line for XXXXX.XXX1. 问题原因:2. 解决方案 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的…

Android Dialog 显示不全的问题

前言&#xff1a;开发的时候发现一些运行到手机里的dialog显示不全&#xff0c;只显示一半左右 问了下chatgpt发现没有任何头绪&#xff0c;于是开始自己慢慢分析 显示去掉了原有的dialog的style发现问题解决了&#xff0c;但在原有基础上如何解决呢&#xff1f; 先看看xml&a…

【LeetCode】每日一题 2024_1_20 按分隔符拆分字符串(模拟/库函数)

文章目录 随便聊聊时间题目&#xff1a;按分隔符拆分字符串题目描述代码与解题思路 随便聊聊时间 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔半个月&#xff0c;LeetCode 每日一题重新开张&#xff0c;寒假学习&#xff0c;正式开始 题目&#xff1…

盖子的c++小课堂:第二十六讲:双向链表

前言 谢谢各位粉丝的支持,望我早日突破1000粉 双向链表 干货!单链表从原理到实现——附python和C++两个版本 - 知乎单链表是链表家族中的一员,每个节点依旧由 数据域(data)和指针域(next)组成,链表的具体概念下面有介绍: 机器学习入坑者:程序员基本功——链表的基…

一天吃透消息队列面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 为什么要使用消息队列&#xff1f; 总结一下&#xff0c;主要三点原因&#xff1a;解耦、异步、削峰。 1、解耦。比如&#xff0c;用户下单后&#xff0c;订单系统需要通知库存系统&#xff0c;假如库存系统无法访问&#xff0…

【电机控制】PMSM无感FOC控制(九)无感启动

0. 前言 终于到了FOC无感入门的最后被一个章节了&#xff0c;无感foc的启动其实很好理解&#xff0c;分为三个阶段&#xff1a;转子定位、I/F强拖、电流转速双闭环。 1. 无感foc启动 &#xff08;1&#xff09;转子定位阶段&#xff1a; 首先将q轴电流设定一个能将转子拖动的值…

U-Mamba: Enhancing Long-range Dependency for Biomedical Image Segmentation

Abstract 卷积神经网络(Convolutional Neural Networks, cnn)和transformer是生物医学图像分割中最流行的架构&#xff0c;但由于固有的局部性或计算复杂性&#xff0c;它们处理远程依赖关系的能力有限。为了解决这一挑战&#xff0c;我们引入了U-Mamba&#xff0c;一个通用的…

IO详解(二)字符流

字符流 FileReader //创建一个文件字符输入流管道与源文件接通 Reader fr new FileReader("D:\\resource\\a.txt");//覆盖管道 Reader fr new FileReader("D:\\resource\\a.txt",true);//追加管道 int c fr.read();---char[] buffer new char[1024]; …

力扣hot100 环形链表 快慢指针 计步器

Problem: 141. 环形链表 文章目录 思路&#x1f496; 快慢指针法&#x1f496; 计步器法 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 快慢指针法 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) /*** Definition for singly-linked list…

IP地址组成

一、简介 ​ IP地址由四段组成&#xff0c;每个字段是一个字节&#xff0c;即4个字节、 每个字节有8位&#xff0c;最大值是255(256&#xff1a;0~255)&#xff0c;是全世界范围是唯一的 32 位&#xff08;4个字节 * 8位&#xff09;的标识符。 ​ IP地址由两部分组成&#x…

Mybatis-Generator-1.4.2

知道代码自动化原理&#xff0c;可以自己搞的&#xff0c;连客户端js html一起弄掉 Low Code Development Platform(LCDP)_cms lcdp-CSDN博客

【模拟】力扣38(Java)

题目 class Solution {public String countAndSay(int n) {String ret "1";for(int i1;i<n;i)//解释n-1次ret{StringBuffer tmp new StringBuffer();int len ret.length();for(int left 0,right 0;right<len;){//双指针while(right < len &&…