Java中顺序表详解

news2025/1/16 5:57:50

前言
在Java编程中,顺序表是一种基础且重要的数据结构。它通常用来表示线性结构数据,如数组等。通过使用顺序表,我们可以轻松管理和操作大量的数据,并实现各种算法和功能。本篇博客将详细介绍Java中顺序表相关的原理、方法和实例,帮助大家更好地理解和应用这一知识点。

一、顺序表的定义
知己知彼,才能百战不殆,想要会写顺序表,我们首先就得知道顺序表是什么。那顺序表是什么呢?如下:

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

说白了,顺序表就是一个数组,但是顺序表的空间大小是可变的,数组不行,数组是死的,但是数组也有数组的好处,顺序表虽然可以实现动态调整大小和快速的插入和删除操作,但是对于随机访问元素时却比数组效率要低。所以,需要进行大量的随机访问,则应该使用数组;如果需要经常进行插入和删除操作,则应该使用顺序表。

二、顺序表的实现
首先,我们得写一个关于顺序表的类,里面放顺序表的增删查改······等方法,我先给个引子,大家可以自己试着先实现方法体,如下:
 

public class SeqList {
    private int elemSize;//表示实际存储了多少个数据
    private int[] elem;
    private static final int space = 10;//先默认给10个空间的容量
    
    // 初始化顺序表
    public SeqList() {
        this.elem = new int[space];//默认赋予10个空间的大小
    }

    // 将顺序表的底层容量设置为initcapacity
    public SeqList(int initcapacity) {}

    //判断是否需要扩容
    private boolean isFull() {}

    // 新增元素,默认在数据最后新增
    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() {}
}

2.1、获取顺序表的长度
能看到这里,说明大家已经写完了,或者已经思考完了,柿子得挑软的捏,我们先实现获取顺序表的长度,那怎么获得呢?我们可以让顺序表的元素等于0就返回吗?因为数组只有初始化没有存数据的话默认值都是0,所以我们遇到0就返回,答案肯定是不行的,假设我们存储的数据中间就是0呢?那不就完蛋了吗。得用其他办法,话说我们不是定义了一个elemSize的属性吗?这个就是顺序表实际存储数据的长度,代码实现如下:
 

public int size() {
  	return this.elemSize;
}

2.2、初始化顺序表
首先,我们得初始化一个顺序表,让他得有空间存数据呀,所以我们就写它的构造方法,代码实现如下:

public SeqList(int initcapacity) {
  	this.elem = new int[initcapacity];
}

2.3、顺序表的查找
 2.3.1、查找位置的元素
想要查找pos位置上的元素,只需要先判断你给的下标是否合法,如果不合法,我们可以抛出异常,如果合法,我们就直接返回下标位置上的元素就好了,下面是代码实现:

public int get(int pos) {
    if (pos < 0 || pos >= this.elemSize) {
      throw new NullPointerException("输入下标不合法!!!");
    }
    return this.elem[pos];
}

2.3.2、查找元素的位置
和上面差不多,还是首先判断位置是否合法,如果合法,那就循环迭代往后走,找到就返回,如果不合法,就return -1;,下面是代码实现:

public int indexOf(int toFind) {
    for (int i = 0; i < this.elemSize; i++) {
        if (this.elem[i] == toFind) {
            return i;
        }
    }
    return -1;
}

2.4、判断是否包含某个元素
相信大家也看到了,返回的是boolean类型,如果有这个元素,返回true,没有返回false,下面是代码实现:

public boolean contains(int toFind) {
    for (int i = 0; i < this.elemSize; i++) {
      if (this.elem[i] == toFind) {
        return true;
      }
    }
    return false;
}

2.5、判断是否需要扩容
本来是要实现怎么增加元素代码的,但是,怎家元素之前,我们需要判断存储的元素是否已经满了,因为两个增加数据的代码都用的到,我懒得写两遍,所以就单独拎出来写了,那怎么判断呢?下面让我来告诉你,代码实现如下:

private boolean isFull() {
  	return this.elemSize >= this.elem.length;
}

2.6、添加元素
2.6.1、尾插
顾名思义,尾插就是从顺序表的尾部插入,那顺序表是谁呢?下面是代码实现:

public void add(int data) {
    if (isFull()) {//判断是否需要扩容
        //扩容代码的实现
        this.elem = Arrays.copyOf(this.elem,2 * this.elemSize);
    }
    this.elem[this.elemSize++] = data;
}

 2.6.2、在指定位置插入
这个比尾插要难一点,我画个图帮助大家理解,如下:

 例如这个顺序表,目前存了如上数据,如果说我要在pos == 5的位置插入一个数字,该怎么办呢?很简单,是不是要先找到这个下标,然后这个下标后面的数据往后移呀,所以我们就可以写如下代码:

public void add(int pos, int data) {
    if (isFull()){//还是和上面一样,一进来判断是否合法
      this.elem = Arrays.copyOf(this.elem,2 * this.elemSize);
    }
    for (int i = this.elemSize; i > pos; ) {
      this.elem[i] = this.elem[--i];
    }
    this.elem[pos] = data;
    this.elemSize++;
}

2.7、删除第一次出现的关键字
首先我们要找到这个数字,然后让这个数字后面的数字全部往前挪,下面是代码实现:

public void remove(int toRemove) {
    if (this.elemSize == 0) {
        return;
    }
    int key = 0;
    boolean flag = false;
    int i = 0;
    for (; i < this.elemSize; i++) {
        if (this.elem[i] == toRemove) {
            System.out.println("存在" + toRemove + "下标为" + i);
            flag = true;
            break;
        }
    }
    if (flag) {
        for (; i < this.elemSize - 1; i++) {
            this.elem[i] = this.elem[i + 1];
        }
        this.elem[--this.elemSize] = 0;
    }
    else {
        System.out.println("未找到!!!");
    }
}

2.8、更改顺序表中的数字
首先判断pos下标是否合法,合法就更改,如果pos等于最后一个元素的后面,就是尾插,elemSize就需要++,下面是代码实现:

public void set(int pos, int value) {
    if (pos >= 0 && pos <= this.elemSize) {
        this.elem[pos] = value;
        if (pos == this.elemSize) {
            this.elemSize++;
        }
    }
    else {
        System.out.println("未找到该位置的下标");
    }
}

2.9、打印顺序表
到这里,我们就得写一个打印函数来打印我们的顺序表了,主要是每一次增删查改后方便检查是否正确的,不用去调试,下面是代码实现:

public void display() {
		System.out.print("SeqList{" + "elem=");
    for (int i = 0; i < this.elemSize; i++) {
        System.out.print(this.elem[i]);
        if (i < this.elemSize - 1) {
            System.out.print(", ");
        }
    }
    System.out.println('}');
}

2.10、清空顺序表
其实只是存数据的话不用写这个,一般来说存引用类型的才需要制空,因为如果不制空,那我们可用的内存就会越来越少,这就是内存泄漏,但是我们还是得意思意思一下,代码实现如下:

public void clear() {
    for (int i = 0; i < this.elemSize; i++) {
        this.elem[i] = 0;
    }
    this.elem = null;
}

写到这儿就都写完了,可以自己去写一个main方法爽一下了。

三、结语
在Java编程的学习之路上,顺序表是第一步不可或缺的环节。虽然这看起来非常基础,但是它却包含了许多深刻的思想和原则,以及不少鲜活的实践案例。这个知识点可能需要长时间、反复地掌握,所以要保持专注和耐心。最终的收获往往会超出我们的预期。

当遇到挫折和困难时,我们需要坚信自己,勇于尝试和学习。程序设计中最美妙的地方就在于,即便面对重重困难,只要你坚定地寻求解决方案并付出努力,终究可以找到突破口。成功并不是唯一的目标,每一个错误和失败都为我们提供了重要的经验教训,帮助我们更好地成长。

因此,在Java编程的道路上,我们不能怕输、要有勇气追梦。与其担心失败的后果,不如预备迎接挑战,并珍视每一次机会逐渐提高自我。记住,“天才”不是先天赋予的,而是通过向内探索和不断尝试而达成的,只要保持学习的热情,我们就会在Java编程的路上越走越远。
 

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

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

相关文章

BRDF

文章目录 0. 写在前面1. 简单理解2. Cook-Torrance BRDF模型2.1 BRDFD 法线分布函数F 菲涅尔G 几何函数1.1.3 L i ( p , ω i ) L_i(p,\omega_i) Li​(p,ωi​)1.1.1 积分框架1.1.2 f r ( p , ω i , ω o ) f_r(p,\omega_i,\omega_o) fr​(p,ωi​,ωo​): 个人疑惑及解答1.…

ESL设计概述

‍‍ ‍‍前言 随着芯片面临着应用场景丰富多变、集成功能模块越来越多、片内通信及模块间接口越来越复杂、设计规模越来越大以及PPA要求越来越高的需求&#xff0c;芯片设计方法面临越来越大的挑战。架构的合理性、完备性和一致性很大程度上决定了芯片设计的成败。基于同样的I…

《基于光电容积图法的两种可穿戴设备在不同身体活动情况下监测心率的一致性:一种新的分析方法》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

电容笔有必要买最好的吗?推荐的ipad手写笔

随着科技的进步&#xff0c;各种类型的电容笔的生产厂家越来越多。一支好的电容笔&#xff0c;不仅能大大提高我们的工作效率&#xff0c;而且能大大提高我们的学习效果。平替电容笔无论从技术水平&#xff0c;还是从产品品质来看&#xff0c;都具有十分广阔的市场前景。以下是…

redis基本数据类型及常见命令

数据库操作 select <库号>: 切换库 默认共有15个 dbsize: 查看当前库的key数量 flushdb: 清空当前库 flushall: 清空所有库 Key的操作 keys *&#xff1a; 查看当前库的所有key exists <key>: 判断该key是否存在 type <key>: 查看该key的类型 de <…

【原创】使用PowerShell配置新安装的ESXI主机

安装PowerCLI 模块 在线安装 优点&#xff1a;简单 缺点&#xff1a;太慢 启动PowerShell命令行&#xff0c;执行行如下命令 Install-Module -Name VMware.PowerCLI离线安装 先到VMware官网下载离线包&#xff0c;然后分几个步骤安装 https://developer.vmware.com/powercl…

redis5新增数据类型

Bitmaps 概念 &#xff08;1&#xff09; Bitmaps本身不是一种数据类型&#xff0c; 实际上它就是字符串&#xff08;key-value&#xff09; &#xff0c; 但是它可以对字符串的位进行操作。 &#xff08;2&#xff09; 可以把Bitmaps想象成一个以位为单位的数组&#xff0c; 数…

HIEE300024R4 UAA326A04什么是反馈和前馈控制系统?

​ HIEE300024R4 UAA326A04什么是反馈和前馈控制系统&#xff1f; 反馈控制系统&#xff1a; 反馈系统测量过程中的值并对测量值的变化做出反应。 在传感器的帮助下测量过程的输出&#xff0c;并将传感器值提供给控制器以采取适当的控制措施。控制器将此传感器信号与设定点进行…

人物专辑丨技术服务展计讯风采,助力客户显计讯担当

正所谓&#xff1a;平凡铸就伟大。一切令人赞叹的不凡&#xff0c;都来自于平凡点滴的坚守&#xff1b;一切砥砺前行的坚持&#xff0c;都来自于责任的担当。 在计讯物联高质量发展的进程中&#xff0c;不乏敢于担当、踏实勤恳、爱岗敬业的计讯人。他们扎根岗位&#xff0c;坚…

grafana-report在grafana7中遇到的问题

一、点击之后报错pdf报错&#xff1a;NO image renderer available/installed 查看grafana日志后&#xff0c;有以下报错&#xff1a; Could not render image, no image renderer found/installed. For image rendering support please install the grafana-image-renderer …

ThingsBoard使用jar包单机部署

1、概述 前面一节我讲了如何初始化数据库表结构以及默认的数据。这一节我将讲解如何使用jar包部署。 2、部署 2.1、修改thingsboard.yml配置 上一节我已经讲解了thingsboard.yml中的基础配置,基础的组件配置如何redis、kafka、Cassandra、pg等大家都知道,关键的地方是在于…

Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001

以前就知道这个了,也见别人用过,在大数据领域有可能会用到所以就看了一下. 其实就是用来,指定数据之间的关系,但是他这个更适合处理,数据之间的大规模的关系 可以看到图数据可以用到上面的这些领域 因为图数据库,更适合处理关系,基于数学中的图论 可以看到,因为如果关系太庞大…

pandas使用教程:pandas resample函数处理时间序列数据

文章目录 时间序列(TimeSeries)执行多个聚合 上采样和填充值通过apply传递自定义功能 DataFrame对象 时间序列(TimeSeries) #创建时间序列数据 rng pd.date_range(1/1/2012, periods300, freqS)ts pd.Series(np.random.randint(0, 500, len(rng)), indexrng) ts2012-01-01 0…

十二、MyBatis分页插件

文章目录 十二、分页插件12.1 分页插件使用步骤12.2 分页插件的使用12.3 测试案例 本人其他相关文章链接 十二、分页插件 12.1 分页插件使用步骤 1. 添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</art…

Java基本数据类型以及包装类型的常量池技术

Java 中的基本数据类型 Java 中有 8 种基本数据类型&#xff0c;分别为&#xff1a; 6 种数字类型&#xff1a; 4 种整数型&#xff1a;byte、short、int、long2 种浮点型&#xff1a;float、double 1 种字符类型&#xff1a;char1 种布尔型&#xff1a;boolean。 这 8 种基本…

Socks5 代理协议:网络安全中的利器

随着网络的普及&#xff0c;网络安全问题已成为各行各业所面临的共同难题。为了保护自己的网络安全&#xff0c;不少人选择使用代理IP&#xff0c;其中 Socks5 代理协议因其安全性、灵活性等优势备受青睐。本文将介绍 Socks5 代理协议及其在网络安全中的作用。 一、什么是 Soc…

安卓手机搭建智能语音客服/通话播音/聊天播音乐技术实现

声明&#xff0c;此项技术需要root支持&#xff0c;如果因为刷机导致手机变砖或其他不可预料的后果请自行解决。 场景 我有一个朋友他是做业务的&#xff0c;主要还是做电销&#xff0c;其实电销相对于以前纪念没那么好做了&#xff08;我自己觉得主要是互联网冲击&#xff0c…

[EIS 2019]EzPOP

[EIS 2019]EzPOP 考点&#xff1a; base64加密&#xff0c;解密的时候按4个的倍数 然后数组里面含有 php代码也可以执行 然后学到了解题思路&#xff0c;逆推然后找各个变量的初始值 <?php error_reporting(0);class A {protected $store;protected $key;protected $expire…

JAVA原生语言开发多学校Saas模式校园管理系统

开发语言&#xff1a;JAVA数据库&#xff1a;MySQL后端框架&#xff1a;Spring boot前端框架&#xff1a;VUE2电子班牌&#xff1a; Android 7.1小程序&#xff1a;原生开发多学校Saas 模式 详细技术栈 前后端分离 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端…

1.数据库的管理(实验报告)

目录 一﹑实验目的 二﹑实验平台 三﹑实验内容和步骤 四﹑命令(代码)清单 五﹑命令(代码)运行结果 一﹑实验目的 了解SQL Server数据库的逻辑结构和物理结构的特点&#xff1b;掌握使用SQL Server管理平台对数据库进行管理的方法&#xff1b;掌握使用Transact-SQL语句对数…