当前位置: 首页 > news >正文

Java实现顺序表

Java顺序表

  • 前言
  • 一、线性表
    • 介绍
    • 常见线性表
    • 总结
    • 图解
  • 二、顺序表
    • 概念
    • 顺序表的分类
    • 顺序表的实现
      • throw
      • 具体代码
  • 三、顺序表会出现的问题


前言

推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。
https://www.captainbed.cn/f1

Java顺序表是Java中实现线性表结构的一种方式,它采用数组来存储元素,通过下标访问元素,具有快速访问和修改特定位置元素的特点,但插入和删除操作可能涉及较多元素的移动。


一、线性表

介绍

线性表(linear list)是n个具有相同特性的数据元素的有限序列。

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

常见线性表

线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

总结

线性表是一种数据结构,由一组有序的元素组成,元素之间具有线性关系。线性表中的元素可以是任意类型的数据,每个元素都有一个前驱元素和一个后继元素(除了第一个和最后一个元素)。线性表可以用于存储和操作一系列有序的数据。常见的线性表有数组、链表、栈和队列等。

图解

在这里插入图片描述

二、顺序表

概念

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

顺序表的分类

顺序表一般可以分为

  • 静态顺序表:使用定长数组存储。
  • 动态顺序表:使用动态开辟的数组存储。

静态顺序表适用于确定知道需要存多少数据的场景.

静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.

顺序表的实现

throw

在Java中,throw关键字用于抛出异常。throw语句必须在方法体内部使用,并且后面跟着一个异常对象,如下所示:

throw new Exception("异常信息");

throw语句会立即终止当前方法的执行,并将异常抛给调用者处理。如果没有被捕获的异常将会导致程序终止。

在自定义类中,可以通过继承Exception类或其子类来创建自定义异常类。可以在方法中使用throw关键字抛出自定义异常对象,如下所示:

public void someMethod() throws CustomException {if (条件) {throw new CustomException("异常信息");}
}

在调用方代码中,可以使用try-catch语句块来捕获和处理异常,如下所示:

try {someMethod();
} catch (CustomException e) {// 处理异常逻辑
}

使用throw语句可以将异常主动抛出,从而提供更丰富的异常处理能力。

具体代码

public class SeqList {private int[] arr; // 存储顺序表的数组private int size; // 记录顺序表中元素的个数// 构造函数public SeqList(int capacity) {arr = new int[capacity];size = 0;}// 打印顺序表public void display() {for (int i = 0; i < size; i++) {System.out.print(arr[i] + " ");}System.out.println();}// 在pos位置新增元素public void add(int pos, int data) {if (pos < 0 || pos > size) {// 位置不合法throw new IllegalArgumentException("Invalid position");}if (size == arr.length) {// 数组已满,需要扩容int[] newArr = new int[arr.length * 2];System.arraycopy(arr, 0, newArr, 0, size);arr = newArr;}// 将pos位置及之后的元素后移for (int i = size - 1; i >= pos; i--) {arr[i + 1] = arr[i];}// 插入新元素arr[pos] = data;size++;}// 判定是否包含某个元素public boolean contains(int toFind) {for (int i = 0; i < size; i++) {if (arr[i] == toFind) {return true;}}return false;}// 查找某个元素对应的位置public int search(int toFind) {for (int i = 0; i < size; i++) {if (arr[i] == toFind) {return i;}}return -1;}// 获取pos位置的元素public int getPos(int pos) {if (pos < 0 || pos >= size) {// 位置不合法throw new IllegalArgumentException("Invalid position");}return arr[pos];}// 给pos位置的元素设为valuepublic void setPos(int pos, int value) {if (pos < 0 || pos >= size) {// 位置不合法throw new IllegalArgumentException("Invalid position");}arr[pos] = value;}// 删除第一次出现的关键字keypublic void remove(int toRemove) {int index = search(toRemove);if (index == -1) {// key不存在return;}// 将index位置及之后的元素前移for (int i = index + 1; i < size; i++) {arr[i - 1] = arr[i];}size--;}// 获取顺序表长度public int size() {return size;}// 清空顺序表public void clear() {size = 0;}
}

这是一个实现顺序表的Java类。顺序表是一种线性表,使用数组存储元素,通过下标访问元素。该类提供了一系列操作顺序表的方法。

  1. 构造函数:创建一个指定容量的顺序表,并初始化大小为0。
  2. display()方法:打印顺序表中的所有元素。
  3. add(int pos, int data)方法:在指定位置插入一个新元素。如果位置不合法,抛出IllegalArgumentException异常。如果数组已满,需要扩容。
  4. contains(int toFind)方法:判断顺序表中是否包含某个元素。
  5. search(int toFind)方法:查找某个元素的位置。如果找到,返回该元素的位置;否则返回-1。
  6. getPos(int pos)方法:获取指定位置的元素。如果位置不合法,抛出IllegalArgumentException异常。
  7. setPos(int pos, int value)方法:将指定位置的元素设为新值。如果位置不合法,抛出IllegalArgumentException异常。
  8. remove(int toRemove)方法:删除顺序表中第一次出现的指定元素。如果元素不存在,不进行任何操作。
  9. size()方法:获取顺序表的大小。
  10. clear()方法:清空顺序表。

这些方法可以帮助我们对顺序表进行插入、删除、查询和修改等操作。

三、顺序表会出现的问题

  1. 顺序表中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

相关文章:

Java实现顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…...

刷题笔记1:如何科学的限制数字溢出问题

LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 我们以力扣的此题目为例&#xff0c;简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式&#xff1a; class Solution { public:int myAtoi(string str) {int pcur0;…...

社区供稿丨GPT-4o 对实时互动与 RTC 的影响

以下文章来源于共识粉碎机 &#xff0c;作者AI芋圆子 前面的话&#xff1a; GPT-4o 发布当周&#xff0c;我们的社区伙伴「共识粉碎机」就主办了一场主题为「GPT-4o 对实时互动与 RTC 的影响」讨论会。涉及的话题包括&#xff1a; GPT-4o 如何降低延迟&#xff08;VAD 模块可…...

基于Linux的文件操作(socket操作)

基于Linux的文件操作&#xff08;socket操作&#xff09; 1. 文件描述符基本概念文件描述符的定义&#xff1a;标准文件描述符&#xff1a;文件描述符的分配&#xff1a; 2. 文件描述符操作打开文件读取文件中的数据 在linux中&#xff0c;socket也被认为是文件的一种&#xff…...

C++面试题记录(网络)

TCP与UDP区别 1. TCP面向连接&#xff0c;UDP无连接&#xff0c;所以UDP数据传输效率更高 2.UDP可以支持一对一、一对多、多对一、多对多通信&#xff0c;TCP只能一对一 3. TCP需要在端系统维护连接状态&#xff0c;包括缓存&#xff0c;序号&#xff0c;确认号&#xff0c;…...

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…...

图论(从数据结构的三要素出发)

文章目录 逻辑结构物理结构邻接矩阵定义性能分析性质存在的问题 邻接表定义性能分析存在的问题 十字链表(有向图)定义性能分析 邻接多重表(无向图)定义性能分析 数据的操作图的基本操作图的遍历广度优先遍历&#xff08;BFS&#xff09;算法思想和实现性能分析深度优先最小生成…...

spark相关知识

1.Spark的特点 Spark的设计遵循“一个软件栈满足不同应用场景”的理念&#xff0c;逐渐形成了一套完整的生态系统&#xff0c;既能够提供内存计算框架&#xff0c;也可以支持SQL即席查询、实时流式计算、机器学习和图计算等。 运行速度快&#xff0c;易使用&#xff0c;强大的技…...

K8S认证|CKA题库+答案| 12. 查看Pod日志

目录 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、提取错误日志 3&#xff09;、验证提取结果 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 您必须在以下C…...

【Java SE】 String、StringBuff和StringBuilder

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 字符串不可变性1.1 设计不可变1.2 修改字符串创建新对象1.3 为什么字符串不可变1.4 String类设计不可变的…...

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发&#xff0c;确定业务目的和目标&#xff0c;将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果&#xff0c;通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…...

Linux 编译器gcc/g++使用

gcc/g同理 编译器运行过程 1. 预处理&#xff08;进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc&#xff0c;从现在开始进行程序的翻译&#xff0c;将预处理工作做完停下 2. 编译&#x…...

adam优化器计算过程(tensorflow)

一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子...

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表…...

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…...

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…...

使用Django框架搭建Web应用

文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架&#xff0c;采用了 MVC&#xff08;模型-视图-控制器&#xff09;设…...

我用Mybatis的方式封装了OLAP查询!

背景 相信做数据平台的朋友对OLAP并不陌生&#xff0c;主流的OLAP引擎有Clickhouse&#xff0c;Impala&#xff0c;Starrocks…以及公司二开的OLAP平台&#xff0c;本次要说的OLAP属于最后一种。 最近在做一个BI项目&#xff0c;业务背景很简单&#xff0c;就是一个数据展示平…...

golang rune类型解析,与byte,string对比,以及应用

Golang中的rune类型是一个32位的整数类型(int32)&#xff0c;它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点&#xff0c;它通常用来处理字符串中的单个字符。 在Golang中&#xff0c;字符常量使用单引号来表示&#xff0c;例如 a。使用单引号表示的字符…...

重学java 51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

C++的std--allocator_traits分配器特性与自定义内存管理的适配

C标准库中的内存管理一直是个既基础又复杂的主题。std::allocator_traits作为C11引入的分配器特性模板&#xff0c;为自定义内存管理提供了统一的适配接口&#xff0c;让开发者能在不重写整套分配逻辑的情况下&#xff0c;灵活扩展内存管理策略。无论是实现高性能内存池&#x…...

[Linux][虚拟串口]x一个特殊的字节

目标&#xff1a;构建带上下文记忆的猫咪聊天机器人 先看代码&#xff1a; from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.messages import SystemMessage,HumanMessage,AIMessage import os from dote…...

手把手教程:在CSDN星图一键部署LFM2.5轻量模型,低配电脑也能跑AI

手把手教程&#xff1a;在CSDN星图一键部署LFM2.5轻量模型&#xff0c;低配电脑也能跑AI 还在为本地跑不动大模型而烦恼吗&#xff1f;今天我要分享一个好消息&#xff1a;即使你的电脑配置不高&#xff0c;也能轻松部署一个实用的AI文本生成模型。LFM2.5-1.2B-Thinking-GGUF就…...

当知识有了‘关系网‘:LightRAG如何让大模型‘秒懂‘你的文档?

想象一下&#xff0c;你有一座藏书万卷的图书馆&#xff0c;但你找书的方式只有一种——记住每本书某个页面的关键词&#xff0c;然后靠"猜"来定位。 这&#xff0c;就是传统RAG系统的尴尬处境。 今天要介绍的这个开源项目LightRAG&#xff0c;被顶会EMNLP 2025接收…...

CH347的JTAG模式怎么选?实测F/T型号在openFPGALoader下的速度与兼容性差异

CH347F与CH347T JTAG模式深度评测&#xff1a;openFPGALoader下的实战性能差异 当你在淘宝搜索"CH347模块"时&#xff0c;会发现两种主要型号&#xff1a;F型多功能版和T型切换版。价格相差无几&#xff0c;但商家描述往往含糊其辞。作为FPGA开发者&#xff0c;最关…...

从仿真到实战:在CST/HFSS中如何设置周期性边界条件评估紧耦合天线阵元性能

从仿真到实战&#xff1a;在CST/HFSS中设置周期性边界条件评估紧耦合天线阵元性能 天线阵列设计中最具挑战性的环节之一&#xff0c;是如何准确预测单个阵元在阵列环境中的真实工作状态。当我在设计第一个超宽带相控阵时&#xff0c;曾因忽视阵元间互耦效应导致实物测试结果与仿…...

华为 eNSP 安装全攻略:Windows 11 25H2 完美适配

本教程适用范围 ✅ Windows 7&#xff08;所有版本&#xff09;✅ Windows 10&#xff08;所有版本&#xff09;✅ Windows 11 23H2 及以下✅ Windows 11 24H2&#xff08;OS 内部版本 ≥ 26100.3624&#xff09;✅ Windows 11 25H2❌ Windows 11 24H2&#xff08;OS 内部版本…...

吃透哈希槽:Redis集群核心分片机制,从原理到实战避坑

在分布式Redis集群中&#xff0c;“数据如何均匀分片、节点如何高效协同”是核心难题。上一篇我们详解了一致性哈希&#xff0c;它通过环形结构解决了传统哈希的节点迁移痛点&#xff0c;但在Redis集群的实际落地中&#xff0c;官方并没有采用一致性哈希&#xff0c;而是选择了…...

TinyUPnP:嵌入式设备轻量级UPnP端口映射实现

1. TinyUPnP&#xff1a;面向嵌入式平台的轻量级UPnP IGD客户端实现 TinyUPnP 是一个专为资源受限嵌入式系统设计的极简 UPnP&#xff08;Universal Plug and Play&#xff09;Internet Gateway Device&#xff08;IGD&#xff09;客户端库&#xff0c;核心目标是 在无用户干预…...

Unpaywall终极指南:一键解锁全球学术论文的免费获取方案

Unpaywall终极指南&#xff1a;一键解锁全球学术论文的免费获取方案 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpaywall-extens…...