ArrayList和顺序表

目录

线性表

顺序表

实现顺序表:

1,添加元素的时候我们要判断是否需要扩容

2,写异常

3,数组清空

ArrayList:

ArrayList的构造方法:

ArrayList的add方法:

ArrayList的subList

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

二维数组:


线性表

就是n个相同类型的数据有序排列;常见的有:顺序表,链表。栈,队列等

顺序表

实现顺序表:

为了更好的掌握ArrayList我们先来定义一个顺序表和接口,用顺序表这个类去实现接口,并重写接口中的所有方法;大家先来自己思考实现。顺序表最基础的两个属性就是数组和有效数组元素的大小

所需要实现的方法:

 // 新增元素,默认在数组最后新增
    public void add(int data);
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind);
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove);
    // 获取顺序表长度
    public int size();
    // 清空顺序表
    public void clear() ;
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() ;

重写方法的代码:(由于代码较长,博主觉得不适合全部放在这里,因为后面学习二叉树等时候代码会更长,但出于详细,才放这里,后面可能不放了(可以看gitee),所以路过的小伙伴可以给博主提建议(放还是不放))

import java.util.Arrays;

public class MyArray implements IExcese{
    public int[] array = {};
    public int size = 0;
    public static final int INIT_SIZE = 5;

    @Override
    //要判断给出的下标是否合理所以我们要来抛出异常
    public void add(int data) {
        array = capitalArray();
        array[size] = data;
        size++;

    }

    @Override
    //注意增加的元素不能隔空增加,比如3没有添加元素就直接在4下标添加,add可以理解为插入
    public void add(int pos, int data) {
        array = capitalArray();
        if(pos<size && pos>=0) {
            int mark = data;
            for(int i = size - 1;i>pos;i--) {
                array[i] = array[i - 1];
            }
            array[pos] = data;
            size++;
        }else {
            throw new DataOverException("数组下标不符合规范");
        }


    }

    @Override
    public boolean contains(int toFind) {
        for(int i = 0; i<size;i++) {
            if(array[i] == toFind) {
                System.out.println("下标位置为:" + i);
                return true;
            }
            return false;

        }
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < size; i++) {
            if (array[i] == toFind) {
                return i;
            }

        }
        return -1;
    }

    @Override
    public int get(int pos) {
        if(pos<0 ||pos>=size) {
            throw new DataOverException("下表不合理");
        }else{
            return array[pos];
        }

    }

    @Override
    public void set(int pos, int value) {
        if(pos<0 ||pos>=size) {
            throw new DataOverException("下表不合理");
        }else{
            array[pos]  = value;
        }

    }

    @Override
    public void remove(int toRemove) {
        int mark = 0;
        int i;
        for(i =0;i<size;i++) {
            if(array[i] == toRemove) {
                mark = 1;
            }
            }
        if(mark ==1) {
            for (int j = i; j < size-1; j++) {
                array[i] = array[i+1];
            }
            size--;
        }else{
            System.out.println("没有该元素");
        }

    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public void clear() {
        for (int i =0 ;i<size;i++) {
            array[i] = null;
        }
        size = 0;

    }

    @Override
    public void display() {
        for(int i = 0;i < size; i++) {
            System.out.println(array[i]);
        }

    }

    @Override
    public String toString() {
        return "MyArray{" +
                "array=" + Arrays.toString(array) +
                ", size=" + size +
                '}';
    }
    private int[] capitalArray() {
        if (size == 0 ) {
            return new int[INIT_SIZE];

        }
        else if(size == array.length) {
            int newSize = size + 5;
            //扩容数组,返回一个新数组
             array = Arrays.copyOf(array,newSize);
             return array;
        } else {
            return array;
        }
    }
}

大部分代码都比较为简单,我们挑几个来说就行;

1,添加元素的时候我们要判断是否需要扩容

扩容需要的方法Arrays.copyOf(),填两个参数,原数组和需要扩容元素的个数,返回的是原数组类型;

同时在指定位置添加的时候,要将元素后移;还要判断数组下标是否合理,不能小于0也不能大于等于size;

2,写异常

当下标不符合要求的时候我们可以写异常来抛出

3,数组清空

防止资源浪费我们要清空数组,由于数组是引用类型,所以我们清空的时候要将数组赋值为null

ArrayList:

ArrayList就类似数组,但为什么还有创建这个类,是因为当我们需要知道并运用这个数组的有效存储元素时,数组是无法满足的(比如数组整体有五个元素的大小,但实际上只存储了三个元素),而且ArrayList当中有很多方法可以使用;

同时ArrayList是泛型类,意味着你可以定义任意类型的数组

ArrayList的方法:

ArrayList方法的使用就和咱们实现的顺序表差不多,要想更加了解这个类当我们就要看其源码(最开始看源码是一件比较痛苦的事,但是我们必须要学会去了解以及深刨,而且上面顺序表的实现也很重要为了更好理解源码)

ArrayList的构造方法:

ArrayList有三个构造方法

1,带一个参数:

2 不带参数

这些字段均是ArrayList的属性

不带参数的时候创建一个空数组;此时没有给数组分配空间(使用add会分配);

3 参数为数组:

我们来解释一下这个参数是什么意思:
c是变量名,Collection要求传入的参数必须是Collection类型或者其子类,<? extends E>中?是通配符的意思,意思是传入的参数还必须是E或者E的子类,而E又指的是,泛型中传入的类型;

我们通过代码来更好地理解一下:其中<>中传入的类型就代表E,()中传入的数组就代表?;ArrayList是Collection的子类,所以arrayList满足第一个条件,arrayList中的元素均是String类型的,所以当传入参数的元素类型是String或者其子类的时候就可以编译成功;而第三行的E是Integer类型,String不是Integer的子类因此编译失败

ArrayList的add方法:

这是add的源码,其中调用的字段都在上张图有显示所以可以对照来看;

整个代码的思路是:

1 是否初始化,如果没有那么返回一个大小为10的数组;

2 如果初始化那么判断数组是否需要扩容,如果不需要那么返回原数组;如果需要那么进行扩容,在最后一步中判断是否扩容后数组元素是否超过了int的最大值,如果没有,那么扩容成功

3 每次扩容的时候会扩大1,5倍,x>>1,x这个值向右移1相当于除以2;

ArrayList的subList

传入两个参数,第一个是数组的起始下标,第二个是终点下标(左闭右开),相当于字符串的截取。但与字符串不同的是,字符串的改变是产生新的对象,但是subList截取后的数组和原数组指向的是同一个对象,因此改变其中一个数组的值另一个数组也会改变。

subList的返回类型是List,List是ArrayList的实现接口;

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

1 重写toString后可以通过sout传入对象打印

2用for打印;

3用foreach这里包装类类型可以用基础类型接收,因为会自动拆包

4 迭代器,这里有个印象就行

二维数组:

ArrayList<ArrayList<Integer>>or<List<List<Integer>>>是二维数组,ArrayList的每个元素都是ArrayList<Integer>类型;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识蒸馏—原理+代码实战(Distillation CNN 和 Progressive Distillation Diffusion)

文章目录 1. Distillation 基本概念2. Distillation MNIST CNN分类代码实战3. Progressive Distillation Diffusion生成代码实战3.1 Progressive Distillation原理3.2 v-parameterization3.2 渐进蒸馏 cifar 代码实战 1. Distillation 基本概念 知识蒸馏被广泛的用于模型压缩和…

使用STM32 HAL库驱动光电传感器的设计和优化

光电传感器在许多应用中起着重要的作用&#xff0c;例如自动计数、距离测量等。STM32微控制器和HAL库提供了丰富的功能和易于使用的接口&#xff0c;使得光电传感器的设计和优化变得更加便捷。本文将介绍如何使用STM32 HAL库驱动光电传感器的设计和优化&#xff0c;包括硬件设计…

Linux Nmap命令解析(Nmap指令)(功能:主机发现、ping扫描、arp扫描、端口扫描、服务版本检测、操作系统识别等)

文章目录 Linux Nmap 命令解析简介Nmap 的核心功能主机发现端口扫描服务版本检测OS 指纹识别&#xff08;操作系统指纹识别&#xff09;脚本扫描 安装 NmapNmap 命令结构Nmap 命令文档英文中文 主机发现Ping 扫描ARP 扫描关于nmap -PR&#xff08;ARP Ping Scan&#xff09;和n…

接口测试工具(Jmeter)必学技巧

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本 目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Choos…

web:NewsCenter

题目 打开页面显示如下 页面有个输入框&#xff0c;猜测是sql注入&#xff0c;即search为注入参数点&#xff0c;先尝试一下 返回空白显示错误 正常显示如下 是因为单引号与服务端代码中的’形成闭合&#xff0c;输入的字符串hello包裹&#xff0c;服务端代码后面多出来一个‘导…

java学习part18抽象类

Java抽象类 详解-CSDN博客 111-面向对象(高级)-抽象类与抽象方法的使用_哔哩哔哩_bilibili 1.概念 2.抽象类 抽象类不能实例化&#xff0c;可以有属性&#xff0c;也可以有方法。 方法可以实现或者只声明不实现&#xff0c;要加一个abstract abstract class A{//定义一个抽…

51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据 1.概述 这篇文章介绍利用串口输出程序执行的数据&#xff0c;辅助我们调试程序&#xff0c;提高代码定位问题的效率。 2.硬件电路原理 3.串口助手查看程序数据 输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点&#xff0…

【CVE-2023-49103】ownCloud graphapi信息泄露漏洞(2023年11月发布)

漏洞简介 ownCloud owncloud/graphapi 0.2.x在0.2.1之前和0.3.x在0.3.1之前存在漏洞。graphapi应用程序依赖于提供URL的第三方GetPhpInfo.php库。当访问此URL时&#xff0c;会显示PHP环境的配置详细信息&#xff08;phpinfo&#xff09;。此信息包括Web服务器的所有环境变量&a…

k8s部署sonarqube

1.先决条件需要storageClass,动态制备,自动创建pv/pvc.详情参见 k8s-StoargClass的使用-基于nfs-CSDN博客 部署postgresql 2.创建ServiceAccount,用于权限管控. [rootmaster /zpf/test]$cat init-sc-serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata:nam…

Joint Bilateral Upsampling

Abstract 图像分析和增强任务&#xff08;例如色调映射、着色、立体深度和蒙太奇&#xff09;通常需要在像素网格上计算解决方案&#xff08;例如&#xff0c;曝光、色度、视差、标签&#xff09;。计算和内存成本通常要求在下采样图像上运行较小的解决方案。尽管通用上采样方…

【MySql】14- 实践篇(十二)-grant权限/分区表/自增Id用完怎么办

文章目录 1.grant之后要跟着flush privileges吗&#xff1f;1.1 全局权限1.2 db 权限1.3 表权限和列权限1.4 flush privileges 使用场景 2. 要不要使用分区表?2.1 分区表是什么?2.2 分区表的引擎层行为2.3 分区策略2.4 分区表的 server 层行为2.5 分区表的应用场景 3. 自增Id…

代码随想录算法训练营第四十九天【动态规划part10】 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;使用一个二维数组dp[i][2]&#xff0c;dp[i][0]代表持有股票的最大收益&…

解决electron-builder打包不成功只能输出tgz文件的问题

现象&#xff1a; 对应项目里配的指令&#xff1a; 但就是死活不成功&#xff0c;只能输出tgz压缩文件。 最后一咬牙下载了官方的electron-quick-start拿来试试&#xff0c;结果还是一样。 一时间没想法了。 后来突然脑袋灵光一闪&#xff0c;去他妈的直接npx 执行看看&…

xxl-job适配postgresql数据库

xxl-job支持了mysql数据库&#xff0c;其他的数据库适配得自己弄一下&#xff0c;下面以目前最新的2.4.1为例进行说明适配postgresql数据库的过程。 获取源代码 从github或gitee获取源代码&#xff0c;目前最新版本2.4.1 xxl官网&#xff1a;分布式任务调度平台XXL-JOB 建立…

docker镜像分层、仓库、容器数据卷与常用软件安装

一、镜像分层 1、镜像概念&#xff1a; 镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;将应用程序和配置依赖打包好行成一个可交付的运行环境&#xff0c;这个打包好的运行环境就是image镜像文件。 2、镜像分层&#xff1a…

在VMcentos7上用docker部署SELKS(IDS系统)

基本安装所需环境&#xff1a; 2核&#xff08;至少&#xff09;10 GB 可用 RAM&#xff08;经测试&#xff0c;4GB也能运行但会卡&#xff09;至少 30 GB 可用磁盘空间&#xff08;实际磁盘占用情况主要取决于规则数量和网络流量&#xff09;。建议使用 200GB SSD 级别。git,…

量子计算软件平台

目录 1.量子语言 2.量子软件开发工具 3.量子云计算平台 1.量子语言 量子语言是一种基于量子计算机的语言&#xff0c;用于描述和实现量子算法。与经典计算机语言不同&#xff0c;量子语言需要考虑量子力学的特殊规则和算法的量子化。其中&#xff0c;最常用的量子语言是量子程…

HCIP --- MGRE综合实验

一、总体规划 二、AR1配置思路及步骤 一、接口地址分配及缺省路由&#xff1a; The device is running! AR1&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sy r1 [r1]interface s4/0/0 [r1-Serial4/0/0]ip address 15.0.0.1 255.0…

React 之 airbnb - 项目实战

一、开发前言 1. 规范 2. 创建项目 node -v > 18.0.0 npm -v > 8.6.0 create-react-app star-airbnb 3. 项目基本配置 配置jsconfig.json {"compilerOptions": {"target": "es5","module": "esnext","ba…

C语言——求π的近似值

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main() {int s;double n,t,pi;t1;pi0;n1.0;s1;while (fabs(t)>1e-6){pipit; nn2; s-s; ts/n;}pipi*4;printf("pi%lf\n",pi);return 0; }这里是求小数点后6位——1e-6&#…