【java数据结构】顺序表

【java数据结构】顺序表

  • 一、了解List接口
  • 二、顺序表
      • 2.1 线性表
      • 2.2 顺序表
      • 2.2.1 顺序表接口的实现
          • 给数组增加新元素
          • 判断数组数据是否为满
          • 在 pos 位置新增元素
          • 判定是否包含某个元素
          • 查找某个元素对应的位置
          • 获取 pos 位置的元素
          • 给 pos 位置的元素设为 value
          • 删除第一次出现的关键字key
          • 获取顺序表长度
          • 清空顺序表
          • 打印顺序表
  • 三、ArrayList类
      • 3.1 ArrayLIst方法
          • 3.1.1 构造方法
          • 3.1.2 常用方法
          • 3.1.3 ArrayLIst的初始容量以及扩容
          • 3.1.4 ArrayLIst的迭代
      • 3.2 ArrayLIst存在问题

此篇博客希望对你有所帮助(帮助里了解List接口,顺序表以及java集合框架中,实现List接口,顺序表的一种具体实现ArrayLIst类),不懂的或有错误的也可在评论区留言,错误必改评论必回!!!持续关注,下一篇博客是ArrayLIst的具体实现,两个例题帮你更加清晰准确理解ArrayLIst类!!!

一、了解List接口

在Java中,List接口是一个非常重要的集合框架接口,它继承自Collection接口(Collection接口继承Iterable接口)。List接口定义了一个有序集合,允许我们存储元素集合。并且可以根据元素的索引来访问集合中的元素。这意味着List中的每个元素都有其固定的位置,可以通过索引来访问和修改。

List接口中包含的方法(因为它拓展了Collection接口和Iterable接口中的功能):
在这里插入图片描述
List接口的实现类有很多,其中最常用的有ArrayList和LinkedList。它们各自有不同的特点和性能表现:

ArrayList:基于动态数组的实现,随机访问性能很好,但在列表的开头和中间插入、删除元素时性能较差,因为需要移动其他元素。
LinkedList:基于链表的实现,在插入、删除元素时性能较好,尤其是当这些操作发生在列表的开头或中间时,但在随机访问元素时性能较差。

二、顺序表

2.1 线性表

线性表是n个具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列…
线性表在逻辑上时线性结构,也就是说连续的一条直线。但是在物理结构上并不一定是连续的。线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.2 顺序表

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

2.2.1 顺序表接口的实现

顺序表的接口包含以下方法:

public interface IList {//给数组增加新元素public void add(int data);//判断数组数据是否为满boolean isFull();// 在 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 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size() ;// 清空顺序表public void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display() ;
}
给数组增加新元素
    public void add(int data) {//首先需要先判断数组是否已经存满if(isFull()){grow();}array[useSize]=data;useSize++;}
判断数组数据是否为满
    @Overridepublic boolean isFull() {//相等返回true;反之,返回falsereturn useSize== array.length;}
在 pos 位置新增元素

这里需要先考虑插入数组下标是否合理,所以需要自己写一个自定义异常!

//自定义的数组下标插入异常
class PosExpection extends RuntimeException{public PosExpection(String message){super(message);}
}
//自定义的异常:判断数组是否为空
class EmptyException extends RuntimeException{public EmptyException(String message){super(message);}
}
    //这个是私有方法,只是为了在这个类中检查数组下标是否合理,// 所以用private修饰private void checkPos(int pos) throws PosExpection{if(pos < 0 || pos >= useSize){throw new PosExpection("数组下标异常");}}@Overridepublic void add(int pos, int data) {try {checkPos(pos);//如果插入数组下表没问题,则判断是否需要扩容if(isFull()){grow();}}catch (PosExpection e){System.out.println("插入数组下标不合理...");e.printStackTrace();}//这里挪动数组,将Pos下标之后的数组往后挪for (int i = useSize-1; i >=pos ; i--) {array[i+1]= array[i];}array[pos]=data;}
判定是否包含某个元素
    @Overridepublic boolean contains(int toFind) {for (int i = 0; i < useSize; i++) {if(array[i]==toFind){return true;}}return false;}
查找某个元素对应的位置
    @Overridepublic int indexOf(int toFind) {for (int i = 0; i < useSize; i++) {if(array[i]==toFind){return i;}}return 0;}
获取 pos 位置的元素
    @Overridepublic int get(int pos) {try {checkPos(pos);return array[pos];}catch (PosExpection e){System.out.println("数组下标不合理...");e.printStackTrace();}return 0;}
给 pos 位置的元素设为 value
    public void set(int pos, int value) {try {checkPos(pos);array[pos]=value;}catch (PosExpection e){System.out.println("数组下标不合理...");e.printStackTrace();}}
删除第一次出现的关键字key
    @Overridepublic void remove(int toRemove) {int pos=indexOf(toRemove);if(pos==-1){return;}for (int i = pos; i <useSize-1 ; i++) {array[i]=array[i+1];}useSize--;}
获取顺序表长度
    @Overridepublic int size() {return useSize;}
清空顺序表
    @Overridepublic void clear() {useSize=0;}
打印顺序表
    @Overridepublic void display() {for (int i = 0; i < useSize; i++) {System.out.print(array[i]+" ");}//这里不能for-each遍历,// 用for-each遍历不管数组里面有没有数据,都会遍历出和数组大小一样的元素,对应下标没有元素会用0来代替。
//        for (int x:
//             array) {
//            System.out.println(x+" ");
//        }}

三、ArrayList类

在集合框架中,ArrayList是一个类,实现了List接口。
ArrayList实现了List接口,而List接口在数据结构的角度上就是线性表的一种抽象。因此,ArrayList可以看作是顺序表在Java集合框架中的一种具体实现。

实现接口:
在这里插入图片描述

  1. ArrayList是通过泛型的方式实现的,使用前必须先实例化。
  2. ArrayList实现了RandomAccess接口,表明ArrayList类支持随机访问。
  3. ArrayLIst实现了Cloneable接口,表明ArrayLIst支持Clone的。
  4. ArrayLIst实现了Serializable接口,表明ArrayLIst支持可序列化。
  5. ArrayLIst不是线程安全的,在单线程下是可以使用的。
  6. ArrayLIst是一段连续的空间,并且可以动态扩容,是一个动态类型的线性表。

3.1 ArrayLIst方法

3.1.1 构造方法

在这里插入图片描述

3.1.2 常用方法

ArrayLIst的常用方法和上面实现顺序表接口的实现差不多。
在这里插入图片描述

3.1.3 ArrayLIst的初始容量以及扩容

1.ArrayList的初始容量是指创建ArrayList对象时所分配的内存空间大小。在Java中,如果没有为ArrayList指定初始容量,它将自动分配一个默认的初始容量0。
2.当向ArrayList中添加元素时,如果元素的数量超过了当前容量,ArrayList会自动扩容。默认的扩容机制是将容量增加原来容量的1.5倍。需要注意的是,扩容操作会重新分配内存空间,并将原有元素复制到新空间中,这个过程需要消耗一定的时间。
3. 如果你在创建ArrayList对象时指定了初始容量,那么ArrayList的初始容量就是这个指定的容量值。例如,如果你写“ArrayList list = new ArrayList(10);”,那么list的初始容量就是10。

3.1.4 ArrayLIst的迭代

1.for循环迭代数组列表中的元素:

package demo1;
import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<String> arrList = new ArrayList<>();arrList.add("hahah");arrList.add("hdbsh");arrList.add("回家");//循环遍历数组for (int i = 0; i < arrList.size(); i++) {System.out.println(arrList.get(i));}}
}

运行结果:
在这里插入图片描述
2.for-each迭代数组列表元素:

    public static void main(String[] args) {ArrayList<Integer> arrList = new ArrayList<>();arrList.add(1);arrList.add(2);arrList.add(8);//循环遍历数组for (int i:arrList) {System.out.println(i);}}

运行结果:
在这里插入图片描述
3.迭代器(Iterator)遍历数组列表元素:
调用ArrayList的iterator方法来获取一个迭代器对象,然后使用while循环和hasNext方法来遍历ArrayList中的元素。在每次循环中,我们调用next方法来获取下一个元素,并将其打印到控制台上。

    public static void main(String[] args) {ArrayList<String> arrList = new ArrayList<String>();arrList.add("26565");arrList.add("26655");arrList.add("22");// 使用迭代器遍历ArrayListIterator<String> it = arrList.iterator();while (it.hasNext()) {String element = it.next();System.out.println(element);}}

运行结果:
在这里插入图片描述

3.2 ArrayLIst存在问题

1.ArrayLIst 底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或往后挪动,故时间复杂度为O(n);
2.增容需要申请空间,拷贝数据,释放旧空间,会有不小的消耗;
3.增容一般呈2倍增长,势必会有一定的空间浪费。例如当容量为100,瞒不了以后增容到200,我们再继续插入5个数据,后面没有数据插入了,那么就浪费了95个空间。

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

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

相关文章

数据结构:将复杂的现实问题简化为计算机可以理解和处理的形式

整句话的总体意义是&#xff0c;**数据结构是用于将现实世界中的实体和关系抽象为数学模型&#xff0c;并在计算机中表示和实现的关键工具**。它不仅包括如何存储数据&#xff0c;还包括对这些数据的操作&#xff0c;能够有效支持计算机程序的运行。通过这一过程&#xff0c;数…

语言模型发展史

四个阶段 第一阶段&#xff1a;基于规则和统计的语言模型 由人工设计特征并使用统计方法对固定长度的文本窗口序列进行建模分析&#xff0c;这种建模方式也被称为N-gram语言模型。 优点&#xff1a; 1&#xff09;采用极大似然估计, 参数易训练 2&#xff09;完全包含了前n-…

Spring(学习笔记)

<context:annotation-config/>是 Spring 配置文件中的一个标签&#xff0c;用于开启注解配置功能。这个标签可以让 Spring 容器识别并处理使用注解定义的 bean。例如&#xff0c;可以使用 Autowired 注解自动装配 bean&#xff0c;或者使用 Component 注解将类标记为 bea…

虚拟机三种网络模式详解

在电脑里开一台虚拟机&#xff0c;是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏&#xff0c;还是用来学习Linux、跑跑应用程序都是很好的。而这其中&#xff0c;虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…

鸿蒙OpenHarmony

开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步&#xff1a;Shell 改 Bash第二步&#xff1a;安装Git和安装pip3工具第三步&#xff1a;远程仓配置第四步&#xff1a;拉取代码第五步&#xff1a;安装编译环境第六步&#xff1a;本地编译源码 Windows开发环境配置第一步&#x…

dubbo微服务

一.启动nacos和redis 1.虚拟机查看是否开启nacos和redis docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps二.创建三个idea的maven项目 1.第一个项目dubboapidemo 2.1.1向pom.xml里添加依赖 …

x-cmd pkg | qrencode - 命令行生成二维码,小白也能轻松上手!

目录 简介首次用户功能特点竞品和相关项目进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件&#xff0c;方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

深入理解 Solidity 中的支付与转账:安全高效的资金管理攻略

在 Solidity 中&#xff0c;支付和转账是非常常见的操作&#xff0c;尤其是在涉及资金的合约中&#xff0c;比如拍卖、众筹、托管等。Solidity 提供了几种不同的方式来处理 Ether 转账&#xff0c;包括 transfer、send 和 call&#xff0c;每种方式的安全性、灵活性和复杂度各有…

SKD4(note上)

微软提供了图形的界面API&#xff0c;叫GDI 如果你想画某个窗口&#xff0c;你必须拿到此窗口的HDC #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> #include <string>/*鼠标消息 * 键盘消息 * Onkeydown * …

STM32 软件触发ADC采集

0.91寸OLED屏幕大小的音频频谱&#xff0c;炫酷&#xff01; STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系&#xff08;深度理解&#xff09; STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能&#xff0c;几乎任何一款单片机都会包含这个功能&a…

阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

作者&#xff1a;胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件&#xff0c;这个事件是 K8s 原生的事件&#xff0c;其实绝大多数的用户并不会关心&#xff0c;同时也可能看不懂。而事件中心&#xff0c;是希望能够…

JS进阶 3——深入面向对象、原型

JS 进阶3——深入面向对象、原型 1.编程思想 面向过程&#xff1a;分析出解决问题的过程&#xff0c;然后用函数将这些步骤一步步封装起来面向对象&#xff1a;将事物分为一个个对象&#xff0c;然后对象之间分工合作 2.构造函数&#xff1a;封装性、面向对象 构造函数方法存…

linux学习--第七天(多路复用IO)

多路复用IO -阻塞IO与非阻塞IO -IO模型 IO的本质时基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的IO方式&#xff08;模型&#xff09;比较常见的有下列三种&#xff1a; 1.阻塞型IO模型 2.非阻塞型IO模型 3.多路复用IO模型 -阻…

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测 开源项目地址&#xff1a;https://gitcode.net/EricLee/yolo_v3 示例&#xff1a;

【C++】多态(下)

个人主页~ 多态&#xff08;上&#xff09;~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

开放式耳机哪个品牌好?分享几款不错的开放式蓝牙耳机

相信很多人戴入耳式耳机时间一久&#xff0c;就不是很舒服。经常会有闷热、不透气的感觉&#xff0c;甚至有的朋友会因为佩戴入耳式耳机滋生细菌&#xff0c;导致最后炎症的发生。总之&#xff0c;入耳式耳机真的不适合长时间佩戴&#xff0c;而且佩戴的场景也有很多限制。 那…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么&#xff1f; 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别&#xff1a; 1、新建项目 Maven&#xff1a; Gradle&#xff1a; 2、配置项目 Maven&#xff1a; Gradle&#xff1a; 3、构建项目——生成项目的jar包 Gradle&…

Linux 信号详解

目录 一.前置知识 1.前台进程和后台进程 a.概念理解 b.相关指令 2.信号的前置知识 a.Linux 系统下信号的概念 b.进程对信号的处理方式 3.信号的底层机制 二.详解信号 1.信号的产生 a.键盘组合键 b.kill 指令和系统调用接口 ① kill 指令 ② kill() 系统调用接口 ③ raise() 系统…

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清&#xff1a; 1.首先&#xff0c;tcp四次挥手只有主动和被动方之分&#xff0c;没有客户端和服务端的概念 2.其次&#xff0c;发送报文段是tcp协议栈的行为&#xff0c;用户态调用close会陷入到内核态 3.再者&#xff0c;图中的情况前提是双…

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…