顺序表 ArrayList

news2024/12/30 3:31:11

目录

1. 概念

2. ArrayList集合框架图

3.ArrayList常见的方法

4. 自己实现ArrayList(Integer)

4.1 ArrayList构造

4.2 ArrayList容量的扩容

4.3 判断空满

4.4 pos坐标是否合法(含有)

4.5 ArrayList的增删元素

4.6 包含元素

4.7 get 和 set

4.8 获得第一个元素坐标

4.9 打印ArrayList 

4.10 清空ArrayList


1. 概念

        ArrayList实现了List接口,它是在一个连续的储存块中储存元素,与数组不同的是,通过在序列尾部添加新的元素,ArrayList能进行动态的增长。顺序表一般情况下采用数组存储,在数组上完成数据的增删查改,并且访问其元素可以直接通过元素的索引直接访问和更新。

        注意:

  • ArrayList是一种动态数组。
  • ArrayList类是一种元素为Object引用的泛型集合。

2. ArrayList集合框架图

则:

  •  ArrayList是泛型实现的,使用时必须进行实例化;
  • ArrayList实现了RandomAccess接口,则ArrayList支持随机访问;
  • ArrayList实现了Cloneabel接口,则ArrayList支持clone;
  • ArrayList实现了Serialzable接口,则ArrayList支持序列化;
  • 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList

3.ArrayList常见的方法

方法        解释
add(E e)尾插一个元素e
add(int index,E e)在index位置插入e
remove(int index)

删除index位置的元素

remove(Object o)

删除第一个遇到的o

get(int index)获得index位置的元素
set(int index,E e)将index位置的元素更新为e
clear()清空ArrayList
indexOf(Object o)返回第一个的o的下标
lastIndexOf(Object o)返回最后一个o的下标
subList(int fromIndex,int toIndex)截取[fromIndex,toIndex)的元素
contains(Object o)判断是否包含o

4. 自己实现ArrayList(Integer)

4.1 ArrayList构造

public class MyArrayList {
    int[] elem;//储存元素
    public int usedSize = 0;//元素个数,ArrayList集合大小默认为0
    private static final int DEFAULT_SIZE = 10;//ArrayList集合容量默认为10
    //构造方法
    public MyArrayList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    ...
}

4.2 ArrayList容量的扩容

        当ArrayList中的元素个数不小于容量时,要对容量进行扩容,就是将ArrayList中的元素克隆到更大的数组中。

    private void ensureCapacity() {
        //将原数组克隆在更大的数组中
        elem = Arrays.copyOf(elem,2*elem.length);
    }

4.3 判断空满

        空:元素为0,即usedSize为0;

        满:元素个数等于容量

    //空
    private boolean isEmpty() {
        return usedSize == 0;
    }
    //满
    public boolean isFull() {
        return usedSize == this.elem.length;
    }

4.4 pos坐标是否合法(含有)

        即pos>=0 && pos < usedSize;

    //是否合法
    public boolean checkPosInAdd(int pos) {
        return pos >= 0 && pos < usedSize;//合法
    }

4.5 ArrayList的增删元素

        在尾插元素的时候,要判断是否具有足够的容量,如果不具有,要进行扩容,即调用4.2中ensureCapacity()方法。

        在具体位置插入元素的时候,要判断坐标是否合法,不能大于数组大小,若大于,抛出异常。

        在删除元素的时候,要判断坐标是否合法,不能大于数组大小,若大于,抛出异常,也要判断是否存在这个元素,若不存在,返回 -1。

   // 新增元素,默认在数组最后新增
    public void add(int data) {
        if(isFull()){
            ensureCapacity();
        }
        this.elem[usedSize] = data;
        usedSize++;
    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(!checkPosInAdd(pos)){
            throw new ArrayIndexOutOfBoundsException("数组越界");
        }else{
            this.elem[pos] = data;
            usedSize++;
        }
    }
    //删除第一次遇到的key
    public void remove(int key) {
        if(isEmpty()){
            return;
        }
        int index = indexOf(key);
        if(index == -1){
            return;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] = elem[i + 1];
        }
        usedSize--;
    }
    //删除index坐标的元素
    public void removeIndex(int index){
        if(!checkPosInAdd(index)){
            throw new ArrayIndexOutOfBoundsException("不合法");
        }else{
            for (int i = index; i < usedSize; i++) {
                elem[i] = elem[i + 1];
            }
            usedSize--;
        }
    }

4.6 包含元素

        即遍历整个数组,是否含有这个元素;

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i :
                this.elem) {
            if (i == toFind){
                return true;
            }
        }
        return false;
    }

4.7 get 和 set

        可以根据索引直接返回和更新值,但是需要注意合法;不合法,抛出异常;

    // 获取 pos 位置的元素
    public int get(int pos) {
        if(!checkPosInAdd(pos)){
            throw new ArrayIndexOutOfBoundsException("数组越界");
        }else{
            return elem[pos];
        }
    }
    // 给 pos 位置的元素设为【更新为】 value
    public void set(int pos, int value) {
        if(!checkPosInAdd(pos)){
            throw new ArrayIndexOutOfBoundsException("越界");
        }else {
            elem[usedSize] = value;
            usedSize++;
        }
    }

4.8 获得第一个元素坐标

        直接遍历数组,第一次碰到的这个元素,返回坐标,没有返回-1;

    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }

4.9 打印ArrayList 

        可以直接遍历整个数组,进行打印;

    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

4.10 清空ArrayList

        直接将usedSize大小变为0即可;

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

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

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

相关文章

操作系统原理 —— 死锁的概念(十七)

什么是死锁 什么是死锁&#xff0c;如果你是个程序员&#xff0c;那么这概念肯定是不陌生的&#xff0c;死锁通常是指&#xff0c;在并发环境下&#xff0c;各个进程因竞争资源而造成一种相互等待的现象&#xff0c;导致的结果就是各个进程都处于阻塞状态&#xff0c;无法往下…

老司机解读香农定理、奈奎斯特定理、编码与调制

工程师都会考虑一个问题&#xff1a;信道上到底可以传输多大的数据&#xff0c;或者指定的信道上的极限传输率是多少。这就是信道容量的问题。例如&#xff0c;在xDSL系统中&#xff0c;我们使用的传输介质是仅有几兆带宽的电话线&#xff0c;而上面要传送几兆、十几兆甚至几十…

cuda编程学习——基础知识介绍!干货向(三)

本文主要内容为介绍CUDA编程前的一些基础知识 参考资料&#xff1a; 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 文章、讲解视频同步更新公众《AI知识物语》&#xff0c;B站&#xff1a;出门吃三碗饭 1&#xff1a;并行计算 并行程序可以分为 指令并行&#xff1…

还在使用System.out+System.currentTimeMillis打印耗时?Xrebel是你不可或缺的神器!

1、概述 在Java应用程序中&#xff0c;性能是至关重要的。由于Java应用程序通常在高并发环境中运行&#xff0c;并处理大量数据&#xff0c;因此需要确保其能够高效地运行。为了帮助开发人员更好地实现Java应用程序的性能调优&#xff0c;ZeroTurnaround推出了XRebel。 XRebe…

测试用例的设计方法(全)

等价类划分方法 一.方法简介 1.定义 是把所有可能的输入数据,即程序的输入域划分成若干部分&#xff08;子集&#xff09;,然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 2.划分等价类&#xff1a; 等价…

Stimulsoft 报表开发工具支持Laravel框架!一起来看~

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

2023-05-24 LeetCode每日一题(T 秒后青蛙的位置)

2023-05-24每日一题 一、题目编号 1377. T 秒后青蛙的位置二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳…

Jupyter Notebook 10个提升体验的高级技巧

Jupyter 笔记本是数据科学家和分析师用于交互式计算、数据可视化和协作的工具。Jupyter 笔记本的基本功能大家都已经很熟悉了&#xff0c;但还有一些鲜为人知的技巧可以大大提高生产力和效率。在这篇文章中&#xff0c;我将介绍10个可以提升体验的高级技巧。 改变注释的颜色 颜…

工程安全监测振弦采集仪在岩土工程中的应用

工程安全监测振弦采集仪在岩土工程中的应用 岩土工程中使用振弦采集仪在工程建设中起着至关重要的作用。振弦采集仪可以测量地面或者岩土中的振动参数&#xff0c;通过这些参数可以对地基、土壤和岩体的性质及其变化进行监测&#xff0c;帮助我们更好地了解工程地质条件和工程建…

Windows 11将加入Copilot的AI助手;约26%的中国用户已经部署了生成式AI技术

&#x1f680; 微软在Build开发者大会上宣布&#xff0c;将在Windows 11中加入一个名为Copilot的AI助手 微软在Build开发者大会上宣布&#xff0c;将在Windows 11中加入一个名为Copilot的AI助手&#xff0c;用户可以在任何应用程序中调用它&#xff0c;并根据用户的需求提供智…

【C++ 学习 ⑧】- STL 简介

目录 一、什么是 STL&#xff1f; 二、STL 的版本 三、STL 的 6 大组件和 13 个头文件 四、学习 STL 的 3 个境界 五、STL 的缺陷 参考资料&#xff1a; STL教程&#xff1a;C STL快速入门&#xff08;非常详细&#xff09; (biancheng.net)。 C STL是什么&#xff0c;有…

“五一”假期出行,伴随着哪些风险

2023年“五一”假期&#xff0c;文化和旅游行业复苏势头强劲&#xff0c;全国假日市场平稳有序。文化和旅游部数据中心测算&#xff0c;全国国内旅游出游合计2.74亿人次。 据交通部门数据显示&#xff0c;自4月27日铁路“五一”假期运输启动以来&#xff0c;截至5月4日&#x…

旧照片怎么修复成新照片?分享三种简单好用的修复方法

旧照片是我们珍贵的回忆&#xff0c;但是随着时间的推移&#xff0c;它们可能会因为自然衰老或者其他原因而变得模糊或者损坏。修复旧照片可以让我们重新体验美好的回忆&#xff0c;保留珍贵的记忆。随着技术的进步&#xff0c;现在可以通过数字化技术将旧照片修复成数字照片&a…

如何理解机器人学习和研究中的存量和增量

对于博客流量也类似如此&#xff0c;存量很重要&#xff0c;增量随着需求减弱&#xff0c;导致后发优秀的博主想要获得更高的关注和流量&#xff0c;需要花费比10年前博主更多的精力和时间。 自己工作地方现状就是存量薄弱&#xff0c;增量缓慢。 存量可以理解为基础增量可以理…

leecode77——组合(回溯算法)

leecode77 组合问题 &#x1f50e;1.回溯算法是什么&#xff1f; 其实回溯算法和我们常说的 DFS 算法非常类似&#xff0c;本质上就是一种暴力穷举算法。回溯算法和 DFS 算法的细微差别是&#xff1a;回溯算法是在遍历「树枝」&#xff0c;DFS 算法是在遍历「节点」。 解决回…

第四十九天学习记录:C语言进阶:结构体

结构体 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问&#xff1a;C的new和C语言的结构体有什么异同&#xff1f; ChatAI答&#xff1a; C中的new是一个运算符&#xff…

Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

产品Backlog •产品backlog是一个按照价值排序的需求清单。 •为了达成产品目标&#xff0c;所有的需求都需要放到产品backlog中进行管理和规划。 •由产品负责人负责管理和维护。 产品Backlog当中的工作按照迭代的方式推进 •在Scrum中Sprint&#xff08;冲刺&#xff09…

Spring Security 中的过滤器链是什么?它的作用是什么

Spring Security是一个安全框架&#xff0c;它提供了强大的安全保护功能&#xff0c;可以帮助开发者更加方便地实现应用程序的安全性。Spring Security中的过滤器链是其中一个非常重要的部分&#xff0c;它起到了非常重要的作用。本文将介绍什么是Spring Security中的过滤器链&…

经典JavaScript手写面试题和答案

文章目录 实现一个函数去重&#xff1f;实现一个函数&#xff0c;判断指定元素在数组中是否存在&#xff1f;实现一个函数&#xff0c;将给定字符串反转&#xff1f;实现一个函数&#xff0c;检测指定字符串是否为回文&#xff08;即从前往后和从后往前的字符序列都相同&#x…

【30天熟悉Go语言】2 Go开发环境搭建、Hello World程序运行

文章目录 一、前言二、安装和配置SDK1、安装2、环境配置 三、开发工具1、GoLand2、VS Code 四、Hello World程序通过命令运行1&#xff09;go build2&#xff09;go run 1、Go 和 Java的文件结构对比2、Go和Java常用包对比 五、Go执行流程1、先编译再运行2、一次性编译运行区别…