【数据结构】从顺序表到ArrayList类

2024-01-23 19:04

本文主要是介绍【数据结构】从顺序表到ArrayList类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • 1.线性表
    • 1.1线性表的概念
    • 2.顺序表
    • 2.1顺序表的概念
    • 2.2顺序表的实现
    • 2.3接口的实现(对数组增删查改操作)
      • 3.ArrayList简介
        • 4. ArrayList使用
    • 4.1ArrayList的构造
    • 4.2 ArrayList的方法
    • 4.3 ArrayList的遍历

1.线性表

1.1线性表的概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
如图所示:
在这里插入图片描述

2.顺序表

2.1顺序表的概念

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

2.2顺序表的实现

因为顺序表存储数据是在一段连续的物理地址依次存储的线性结构,我们一般采用数组的形式来进行存储,通过在数组中完成数据的增删查改的操作。
2.2.1数组的创建

public class MyArrayList {
//定义一个未被初始化的数组elempublic int[] elem;//定义一个记录该数组存了多少容量public int size;//将该容量设置为一个常量,为了到后面调构造方法的时候初始化数组的大小public static final int DEFAULT_CAPACITY = 5;//调用构造函数的时候初始化数组的大小,而size成员变量不需要初始化,因为一开始未被初始化,默认初始化为0.public MyArrayList() {this.elem = new int[DEFAULT_CAPACITY];}
}

2.2.2提供一些接口

public interface Ilist {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某个元素boolean contains(int toFind);// 查找某个元素对应的位置int indexOf(int toFind);// 获取 pos 位置的元素int get(int pos);// 给 pos 位置的元素设为 valuevoid set(int pos, int value);//删除第一次出现的关键字keyvoid remove(int toRemove);// 获取顺序表长度int size();// 清空顺序表void clear();//打印这个数组的内容void display();//判断是否空间满了boolean isFuul();boolean isEmpty();
}

2.2.3提供一些异常类
1.判断数组中是否为空的异常
2.判断下标是否合法的异常

//1.判断数组中是否为空的异常
public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}
//2.判断下标是否合法的异常
public class PosException extends RuntimeException{public PosException() {}public PosException(String message) {super(message);}
}

2.3接口的实现(对数组增删查改操作)

2.3.1 新增元素,(默认在数组最后新增)

 //往最后位置插入数据public void add(int data) {//判断空间是否满了,如果满了就扩容2倍if(isFuul()) {elem = Arrays.copyOf(elem,2*elem.length);System.out.println("扩容成功");}elem[size] = data;size++;}@Overridepublic boolean isFuul() {return size == elem.length;}

2.3.2打印数组全部内容

//打印数组全部内容@Overridepublic void display() {for (int i = 0; i < size; i++) {System.out.println(elem[i]);}}

2.3.3在 pos 位置新增元素

 // 在 pos 位置新增元素@Overridepublic void add(int pos, int data) {//判断pos是否合法checkPosOfAdd(pos);//判断是否需要扩容if(isFuul()) {elem = Arrays.copyOf(elem,2*elem.length);}//最后在pos位置插入新元素for(int i=size-1;i>=pos;i--) {elem[i+1] = elem[i];}elem[pos] = data;size++;}//判断pos是否合法的方法,在顺序表中插入数据的时候,插入的位置前面必须要有数据。private void checkPosOfAdd (int pos) {if(pos<0 || pos>size) {throw new PosException("pos的位置不合法:"+pos);}}

2.3.4判定是否包含某个元素

// 判定是否包含某个元素//直接遍历数组然后一一和目标元素比较,有就返回true,没有就返回false。@Overridepublic boolean contains(int toFind) {for(int i=0;i< elem.length;i++) {if(toFind == elem[i]) {return true;}}return false;}

2.3.5查找某个元素对应的位置

// 查找某个元素对应的位置//直接遍历数组然后一一和目标元素比较,有就返回对应的下标,没有就返回-1。@Overridepublic int indexOf(int toFind) {for(int i=0;i< elem.length;i++) {if(toFind == elem[i]) {return i;}}return -1;}

2.3.6 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素

// 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素@Overridepublic int get(int pos) {//判断pos位置是否合法checkPosOfGet(pos);//判断这个顺序表是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}return elem[pos];}

2.3.7判断顺序表是否为空

 //判断顺序表是否为空@Overridepublic boolean isEmpty() {return size == 0;}//判断pos合不合法的方法private void checkPosOfGet (int pos) {if(pos<0 || pos>size) {throw new PosException("pos的位置不合法:"+pos);}}

2.3.8给 pos 位置的元素设为 value

 // 给 pos 位置的元素设为 value@Overridepublic void set(int pos, int value) {//判断pos是否合法checkPosOfSet(pos);//判断顺序表是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}//修改pos位置的内容this.elem[pos] = value;}private void checkPosOfSet (int pos) {if (pos < 0 || pos > size) {throw new PosException("pos的位置不合法:" + pos);}}

2.3.9删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。

//删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。@Overridepublic void remove(int toRemove) {//判断顺序表中是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}//找到我们需要删的这个数int indexof = indexOf(toRemove);for(int i = indexof;i<size-1;i++) {elem[i] = elem[i+1];}size--;}

2.3.10获取顺序表长度 直接返回size

// 获取顺序表长度 直接返回size@Overridepublic int size() {return this.size;}

2.3.11清空顺序表

// 清空顺序表@Overridepublic void clear() {size = 0;}

3.ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
【说明】

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
4. ArrayList使用

4.1ArrayList的构造

1.ArrayList() 无参构造:

List<Integer> list1 = new ArrayList<>();

2.ArrayList(int initialCapacity)指定顺序表初始容量:

List<Integer> list2 = new ArrayList<>(5);

3.ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList:相当于传入其他的ArrayList顺序表,使得这个顺序表的大小容量与数据类型和传入的顺序表是一致的。

List<Integer> list3 = new ArrayList<>(list2);

4.2 ArrayList的方法

4.2.1尾插法

public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);System.out.println(list2);}

结果显示:
在这里插入图片描述
4.2.2将目标值插到指定index位置

 list2.add(1,6);System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.3删除 index 位置元素

 list2.remove(2);System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.4获取下标 index 位置元素

System.out.println(list2.get(3));

结果显示:
在这里插入图片描述

4.3 ArrayList的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach。
1.for循环+下标:

 public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);for (int i = 0; i < list2.size(); i++) {System.out.print(list2.get(i)+" ");}}

结果显示:
在这里插入图片描述
2.foreach:

public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);System.out.println("foreach循环下:");for (Integer integer:list2) {System.out.print(integer+" ");}}

结果显示:
在这里插入图片描述
最后,ArrayList是一个动态类型的顺序表,不够空间会自动扩容。

好久没更新了,在这我向我的老铁们道个歉,从今天开始更新关于java的数据结构的内容,希望大家多多支持。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

这篇关于【数据结构】从顺序表到ArrayList类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637231

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig