【java数据结构】顺序表

news2024/11/28 17:46:04

【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 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public 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++;
    }
判断数组数据是否为满
    @Override
    public boolean isFull() {
        //相等返回true;反之,返回false
        return 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("数组下标异常");
        }
    }
    @Override
    public 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;
    }
判定是否包含某个元素
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < useSize; i++) {
            if(array[i]==toFind){
                return true;
            }
        }
        return false;
    }
查找某个元素对应的位置
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < useSize; i++) {
            if(array[i]==toFind){
                return i;
            }
        }
        return 0;
    }
获取 pos 位置的元素
    @Override
    public 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
    @Override
    public 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--;
    }
获取顺序表长度
    @Override
    public int size() {
        return useSize;
    }
清空顺序表
    @Override
    public void clear() {
         useSize=0;
    }
打印顺序表
    @Override
    public 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");

                // 使用迭代器遍历ArrayList
                Iterator<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.coloradmin.cn/o/2186658.html

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

相关文章

Manim:使用Python绘制数学动画

Manim是一个由3Blue1Brown的Grant Sanderson开发的开源框架&#xff0c;用户可以通过编写Python代码来创建数学动画&#xff0c;适用于教学、科研和科普宣传等多个领域。 Manim的核心功能之一是动画效果的创建和控制。它提供了多种动画效果&#xff0c;如创建、变换、淡入淡出…

分布式数据库知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1&#xff08;建立项目、执行_建立第一个工程) 建立第一个工程&#xff0c;使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application&#xff08;最常使用&#xff09; 2.项目保存位…

使用Pytorch构建自定义层并在模型中使用

使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类&#xff0c;自定义名称为NoisyLinear的线性层&#xff0c;并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…

LSM6DSV16X基于MLC智能笔动作识别(2)----MLC数据采集

LSM6DSV16X基于MLC智能笔动作识别.2--MLC数据采集 概述视频教学样品申请源码下载输出速率执行流程速率设置量程设置检测状态数据单位采集数据静止(Steady)闲置(Idle)书写(Writing)其他(other) 概述 MLC 是“机器学习核心”&#xff08;Machine Learning Core&#xff09;的缩写…

全球购的智能引擎:AI与RPA如何重塑跨境电商帝国?

在全球化的大潮中&#xff0c;跨境电商已成为连接世界的桥梁。随着人工智能&#xff08;AI&#xff09;和机器人流程自动化&#xff08;RPA&#xff09;技术的飞速发展&#xff0c;跨境电商领域的运作模式正在经历一场革命性的变革。 一、跨境电商的挑战 随着互联网技术的普及…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

在VirtualBox中安装OpenEuler操作系统保姆级教程

前言 OpenEuler是一个由中国华为公司主导开发和维护的开源操作系统项目&#xff0c;旨在打造一个开放、可信且可扩展的企业级操作系统&#xff0c;适用于多种应用场景。 该项目致力于通过开放和协作的方式推动操作系统的创新与发展。OpenEuler采用开源软件模型&#xff0c;允…

多模态:Florence2论文详解

文章目录 前言一、介绍二、方法1.模型结构1&#xff09;Vision encoder2&#xff09;Multi-modality encoder decoder3&#xff09;Optimization objective 2.数据工程1&#xff09;Image Collection2&#xff09;Data Annotation3&#xff09;Data filtering and enhancement4…

spring学习日记-day8-声明式事务

一、学习目标 声明式事务是Spring框架提供的一种事务管理方式&#xff0c;其主要特点是通过声明&#xff08;而非编程&#xff09;的方式来处理事务。这种方式让事务管理不侵入业务逻辑代码&#xff0c;从而提高了代码的可维护性和可读性。 定义&#xff1a;声明式事务…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56

【数据结构笔记13】

408数据结构答题规范 原视频 视频参考&#xff0c;以下为视频的笔记 需要写的部分 如果题目要求了函数名、参数列表、返回值类型就按题目的来 函数的类型可以是返回值类型或者void类型&#xff0c;如果函数名不清楚里面的功能是什么&#xff0c;在函数title下面最好写一行注…

磁盘存储和文件系统管理【1.9】

磁盘存储和文件系统管理【1.9】 12、磁盘存储和文件系统12.1.管理存储12.1.1.新加10G硬盘并识别12.1.2.备份查看MBR分区表二进制信息12.1.3.删除破坏分区表12.1.4.恢复MBR分区表12.1.5.完整步骤12.1.6.fdisk分区12.1.7.gdisk分区12.2.文件系统12.2.1.查看支持的文件系统格式12.…

音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和一个ScriptDataV…

Java类的生命周期-连接阶段

Java类的生命周期-连接阶段 上篇讲述了类的加载阶段&#xff0c;通过类加载器读取字节码文件后在方法区与堆区生成对应的存放类信息的对象&#xff0c;本篇将讲解他的下一阶段-连接阶段 上篇说到类加载的五大阶段&#xff1a; #mermaid-svg-6YmaEnIO4rCKbIZg {font-family:&quo…

Cpp::STL—vector类的模拟实现(11)

文章目录 前言一、各函数接口总览二、默认成员函数vector();vector(size_t n, const T& val T( ));template< class InputIterator> vector(InputIterator first, InputIterator last);vector(const vector<T>& v);vector<T>& operator(const v…

腾讯云SDK基本概念

本文旨在介绍您在使用音视频终端 SDK&#xff08;腾讯云视立方&#xff09;产品过程中可能会涉及到的基本概念。 音视频终端 SDK&#xff08;腾讯云视立方&#xff09; 应用 音视频终端 SDK&#xff08;腾讯云视立方&#xff09;通过应用的形式来管理您的项目&#xff08;Ap…

C/C++进阶(一)--内存管理

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 ​​​​​​项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…

免费录屏软件工具:助力高效屏幕录制

录屏已经成为了一项非常实用且广泛应用的技术。无论是制作教学视频、记录游戏精彩瞬间&#xff0c;还是进行软件操作演示等&#xff0c;我们都常常需要一款可靠的录屏软件。今天&#xff0c;就让我们一起来探索那些功能强大录屏软件免费版&#xff0c;看看它们是如何满足我们多…

ARTS Week 42

Algorithm 本周的算法题为 2283. 判断一个数的数字计数是否等于数位的值 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#xff0c;都满足数位 i 在 num 中出现了 num[i]次&#xff0c;那么请你返回 true …