【Java数据结构】顺序表

news/2024/4/27 11:43:35/文章来源:https://blog.csdn.net/m0_66488562/article/details/127192302

我们不过是普通人,只不过在彼此眼中闪闪发光


目录

1.模拟实现顺序表

1.1 顺序的结构 

1.2 顺序表的成员属性 

1.3 顺序表的构造方法

1.4 顺序表的成员方法 

1.4.1 扩容 

1.4.2 打印顺序表

1.4.3 尾插

1.4.4 在指定位置插入

1.4.5 判断数组中是否有这个元素 

1.4.6 返回指定元素的下标

1.4.7 获取指定位置存储的元素

1.4.8 给指定位置元素设置为指定值

1.4.9 删除第一次出现的指定元素

1.4.10 获取顺序表中存储数据的个数

1.4.11 清空顺序表

2.浅谈Java中ArrayList类 

2.1 ArrayList类的定义 

2.1 ArrayList的成员属性

2.2 ArrayList的构造方法  

2.2.1 无参构造方法 

2.2.2 有参构造方法

2.3 ArrayList的方法

2.3 ArrayList的遍历 

2.3.1 for循环+下标法

2.3.2 foreach法

2.3.3 迭代器法


1.模拟实现顺序表

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

那我接下来我们就自己模仿一个顺序表,来实现数据的增删查改:  

1.1 顺序的结构 

在写顺序表的时候需要把成员属性成员方法写在中 ,所以在写之前需要把创建一个顺序表的类:

public class MyArrayList {}

接下来我们要将写的成员属性和成员方法都写在这个 MyArrayList 类当中 

1.2 顺序表的成员属性 

arr:一个顺序表最主要的就是存放数据,有了数据才可以进行一些成员方法的操作,顺序表之所以叫做顺序表因为它是按顺序进行存储数据的,数组也是按顺序进行存储的,那我们就可以定义一个数组类型的成员变量用来存储数据

number:有些方法的操作需要在最后一个数据后面一个位置进行操作比如尾插、尾删都需要知道最后一个数据后面一个下标,那么我们就可以定义一个 int 类型成员变量来记录数据的个数,因为数组从0下标开始,那我定义的记录数据个数的成员变量肯定就是对应在最后一个数据后面的一个位置下标

volume:我们存储数据的时候肯定需要开辟空间,开辟多大的空间我们就可以定义一个静态整型的成员变量在固定每次开辟空间的大小

sum:当数据个数等于数据容量的时候就需要增加容量,那么我们就可以定义一个整型的成员变量来存储当前数组的容量大小,方便后面判断是否需要增加容量 

private int[] arr;//存放数据数组
private int number;//数据个数
private static final int volume = 10;//容量
private int sum = volume;//数组容量

1.3 顺序表的构造方法

我们在学习 JavaSE 的时候有学习到构造方法,构造方法在实例化一个对象的时候会自动执行且只会在这个对象中只执行一次,当我们实例化一个顺序表的时候就需要给它开辟空间,那我们就可以利用构造方法来给它开辟空间,在实例化对象的时候直接给它开辟一个 volume 大小的空间,后序空间不够的时候在用成员方法进行扩容,所以上述成员变量记录数组容量的我们定义时直接给它赋值为了 volume

//构造方法第一次初始化数组容量
public MyArrayList() {this.arr = new int[volume];
}

1.4 顺序表的成员方法 

1.4.1 扩容 

number 是记录数据的个数,sum 是记录数组大小,如果number >= sum 说明数组已经存不下数据了,那么就需要给数组进行增加容量 ,然后将 sum 设置为当前数组扩容的空间大小

//扩容
public void JudgeNull() {if (number >= sum) {arr = Arrays.copyOf(arr,volume * 2);}sum *= 2;
}

1.4.2 打印顺序表

打印顺序表只需要将数组遍历到 number-1,因为数组下标从0开始,数组中只存放了 number 个数据

// 打印顺序表
public void display() {for (int i = 0; i < number; i++) {System.out.print(arr[i]+" ");}System.out.println();
}

1.4.3 尾插

在数组中最后一个元素后面一个位置进行新增 ,首先在新增对象之前判断是否需要增容,然后在将 data 数据存储在数组中最后一个元素后面一个位置,然后number++

// 新增元素,默认在数组最后新增
public void add(int data) {JudgeNull();arr[number] = data;number++;
}

1.4.4 在指定位置插入

在指定位置进行插入对象,首先在新增对象之前判断是否需要增容,然后在判断位置是否合法,如果位置小于数据的个数且合法那么就将pos位置及后面位置整体向后移动,然后将data放在pos位 置,然后number++,如果pos等于数据个数那么就等于尾插,否则就位置不合法

// 在 pos 位置新增元素
public void add(int pos, int data) throws AddException{JudgeNull();if (pos < number && pos >= 0) {for (int i = number; i >= pos ; i--) {arr[i] = arr[i - 1];}arr[pos] = data;number++;} else if (pos == number) {add(data);} else {throw new AddException("插入位置不合法");}
}

1.4.5 判断数组中是否有这个元素 

将数组遍历到 number-1 位置,如果里面有 toFind 这个元素就返回 true,如果遍历完还没有就直接返回 false 

// 判定是否包含某个元素
public boolean contains(int toFind) {for (int i = 0; i < number; i++) {if (arr[i] == toFind) {return true;}}return false;
}

1.4.6 返回指定元素的下标

 将数组遍历到 number-1 位置,如果里面有 toFind 这个元素就返回当前位置下标 i,如果遍历完还没有就直接返回 -1

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

1.4.7 获取指定位置存储的元素

 首先判断这个位置是否已经存储了元素,如果指定位置小于数据个数,且位置 >=0 就返回当前位置的元素,否则返回 -1

// 获取 pos 位置的元素
public int get(int pos) {if (pos < number && pos >= 0) {return arr[pos];} else {return -1;}
}

1.4.8 给指定位置元素设置为指定值

判断位置是否合法,如果位置小于数据的个数且合法那么就将pos位置设置为 value 值,如果pos等于数据个数那么就等于尾插,否则就位置不合法 

// 给 pos 位置的元素设为 value
public void set(int pos, int value)throws AddException {if (pos < number && pos >= 0) {arr[pos] = value;} else if (pos == number) {add(value);} else {throw new AddException("设置的位置不合法");}
}

1.4.9 删除第一次出现的指定元素

首先将数组遍历到 number-1 位置,在遍历过程中如果找到指定元素就将这个位置后面所以的元素前移一位,就删掉了这个元素然后number--,否则里面就没有这个元素就不需要删除 

//删除第一次出现的关键字key
public void remove(int toRemove) {for (int i = 0; i < number; i++) {if (arr[i] == toRemove){for (int j = i; j < number; j++) {arr[j] = arr[j+1];}number--;return;}}
}

1.4.10 获取顺序表中存储数据的个数

number成员变量就是用来存储当前数组中元素个数的,直接返回number即可 

// 获取顺序表中存储的元素个数
public int size() {return number;
}

1.4.11 清空顺序表

将数组遍历到 number - 1位置,在遍历过程中将每个位置中的元素都设置为 0,遍历完后将number 设置为 0 

// 清空顺序表
public void clear() {for (int i = 0; i < number; i++) {arr[i] = 0;}number = 0;
}

2.浅谈Java中ArrayList类 

我们按住 ctrl 键点击 ArrayList 即可来到 ArrayList 类中 

2.1 ArrayList类的定义 

  • ArrayList是一个泛型类,它继承了AbstractList 这个抽象泛型类
  • ArrayList实现了 List 泛型接口
  • ArrayList实现了RandomAccess接口表明ArrayList支持随机访问
  • ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  • ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

ArrayList 和 Vector 不同,ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector 或者 CopyOnWriteArrayList

ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表 

2.1 ArrayList的成员属性

elementData:用来保存ArrayList数据的数组,这个数组会不断改变,前面没有 final 修饰表示地址值会发生变化 

2.2 ArrayList的构造方法  

2.2.1 无参构造方法 

使用无参构造方法将 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 这个空数组赋值给 elementData 这个数组,无参构造方法不会开辟空间。而是在第一次使用 add 方法的时候开辟 DEFAULT_CAPACITY 大小的空间

2.2.2 有参构造方法

1.指定顺序表的初始容量  

 2.利用其他 Collection 构建 ArrayList

2.3 ArrayList的方法

方法解释
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection c)尾插 c 中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List subList(int fromIndex, int toIndex)截取部分 list

 如果有人想看这些方法的实现过程可以去IDEA中查看

2.3 ArrayList的遍历 

public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);arrayList.add(6);arrayList.add(7);
}

 如何将上面的 arrayList 对象进行遍历呢?

2.3.1 for循环+下标法

for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));
}

2.3.2 foreach法

for (int x:arrayList) {System.out.println(x);
}

2.3.3 迭代器法

Iterator<Integer> it = arrayList.listIterator();
while(it.hasNext()){System.out.println(it.next());
}

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

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

相关文章

SSH婴幼儿产品销售系统电商购物系统(含源码+论文+答辩PPT等)

该项目采用技术JSP、strust2、Spring、Hibernate、Tomcat服务器、MySQL数据库 &#xff0c;项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程 本系统结构如下&#xff1a; 1&#xff0c;游客访问 |–系统首页&#xff0c;查看所有的商品信息和相关的菜单信息 |–…

每日一记:笔记工具使用、计算机基础知识、编程语言认识

1、笔记工具的使用 我现在使用的是typora这个文档工具 markdown语法 常见操作有&#xff1a;标题、代码块、引用、列表等 typora工具的主页面 我们可以编辑内容 做笔记 。。。 标题分类&#xff1a; 和html&#xff08;超文本标记语言 前端部分一样&#xff09;分为六级标题…

拉卡拉第三季营收13.45亿:净利8372万 同比降73%

雷递网 雷建平 10月31日拉卡拉支付股份有限公司&#xff08;证券代码&#xff1a;300773&#xff0c;证券简称&#xff1a;拉卡拉&#xff09;日前发布财报&#xff0c;财报显示&#xff0c;拉卡拉2022年前三季营收43.55亿元&#xff0c;同比降11.83%&#xff1b;拉卡拉2022年前…

Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

文章目录Shell字符串单引号双引号拼接字符串获取字符串长度提取子字符串查找子字符串Shell数组定义数组读取数组获取数组的长度Shell注释流程控制if判断case语句for 循环while 循环read 读取控制台输入Shell字符串 字符串是shell编程中最常用最有用的数据类型&#xff08;除了…

【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计

写在前面 本系列为 DDR3 控制器设计总结&#xff0c;此系列包含 DDR3 控制器相关设计&#xff1a;认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等&#xff0c;附上汇总博客直达链接。 【DDR3 控制器设计】系列…

爆破校园网的宽带

前提&#xff1a;学校的手机号前7位相同&#xff0c;宽带密码都是手机号后六位。仅供学习。 准备工作&#xff1a;电脑一台&#xff0c;把校园网的宽带水晶头插在电脑上&#xff0c; 步骤&#xff1a; winR输入Rasphone点击新建&#xff0c;宽带&#xff0c;输入宽带名称&am…

Kubernetes(31):kubeasz单主机模式

前言 有时候&#xff0c;我们只需要k8s集群进行项目测试&#xff0c;能够使用的主机可能只有一台&#xff0c;那么如何构建一台单机的k8s集群&#xff1f; 单机版的k8s集群可以用于本地测试&#xff0c;或者内部测试环境&#xff0c;或者个人电脑上的项目测试。 那么我们可以使…

Html保留空格和换行

效果&#xff1a; 代码&#xff1a; <pre> 这是一段文本这是一段文本这是一段文 本这是一 段文本这是一段文本 </pre>

会话技术(Session、Cookie)详细介绍

会话技术 request&#xff1a;接收请求 接收请求行 接收请求方式&#xff1a;request.getMethod()接收项目路径&#xff1a;request.getContextPath() 接收请求头 request.getHeader(String name) 接收请求参数 中文参数&#xff1a; get方式&#xff1a;不乱码。因为tomcat8.…

NIO Buffer类的重要方法

1 allocate()创建缓冲区 在使用Buffer&#xff08;缓冲区&#xff09;之前&#xff0c;我们首先需要获取Buffer子类的实例对象&#xff0c;并且分配内存空间。为了获取一个Buffer实例对象&#xff0c;这里并不是使用子类的构造器new来创建一个实例对象&#xff0c;而是调用子类…

带你走入C++动态多态的底层

多态按字面的意思就是多种形态&#xff0c;相同的方法调用&#xff0c;但是有不同的实现方式。多态性可以简单地概括为“一个接口&#xff0c;多种方法&#xff0c;实现接口与实现的分离。 C有两种多态形式&#xff1a; 静态多态动态多态而本文主要介绍动态多态的应用。 动态…

力扣1662(javapython)-检查两个字符串数组是否相等(简单)

题目: 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。示例 1: 输入:word1 = ["ab", "c"], word2 = ["a", "bc…

SpringBoot:ssm和springboot整合

目录 一、整合Mybatis 因为要使用逆向生成代码 pom.xml generatorConfig.xml application.yml 测试 BookController SpringbootmybatisApplication jdbc.properties 二、整合mybatisplus 简介 application.yml MPGenerator SpringbootmpApplication 三、使用my…

ensp华为配置NAT

ensp华为配置NAT 文章目录ensp华为配置NAT1 对PC进行地址、掩码及网关配置2 对路由器进行初始配置3 ART配置3.1 静态NAT配置3.2 动态NAT配置3.3 端口NAT (NAPT) 的配置3.4 Easy IP的配置3.5 NAT Server的配置4 总结拓扑图如图&#xff1a;1 对PC进行地址、掩码及网关配置 略 …

计算机毕设(附源码)JAVA-SSM佳音大学志愿填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机毕设(附源码)JAVA-SSM蓟县农家乐网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

通俗易懂!一文看懂手机Root的操作与防护

Root&#xff0c;对于任何手机发烧友、玩机客、从事移动设备研发的人员来说&#xff0c;并不陌生&#xff0c;它代表绝大部分移动设备的使用者能够掌握到的最高权限。 从技术层次来讲&#xff0c;用户拥有了修改系统文件的权限&#xff0c;甚至可以控制账户、增加或删除硬件等…

java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统

基于javaJSPsqlserver的智能在线考试信息管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJSPsqlserver的智能在线考试信息管理系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&a…

内部财务经营分析该怎么做?

对于日常在企业工作的财务人员来说&#xff0c;做对外财务报表分析的机会并不多&#xff0c;我们在网上经常看到的对上市公司财务报表的分析&#xff0c;是基于投资人的角度来对这家公司披露的财务及经营信息所做的分析。 实际工作当中&#xff0c;大家应用到更多的其实是内部…

【Linux详解】——gcc/g++/gdb/git的使用

&#x1f4d6; 前言&#xff1a;本期将学习gcc/g/gdb/git的使用 目录&#x1f552; 1. 程序的翻译过程&#x1f552; 2. 理解选项的含义&#x1f552; 3. 动态链接和静态链接&#x1f552; 4. Linux项目自动化构建工具-make/Makefile&#x1f558; 4.1 背景&#x1f558; 4.2 使…