Java数据结构(List介绍和顺序表)

news2024/12/28 22:02:02

1、List的介绍

在这里插入图片描述
在这里插入图片描述

在集合框架中,List是一个接口,继承自Collection(也是一个接口)。
Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的。

站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。

常用方法

下表是实现它的基础功能。
// 其中 E 是数据类型
在这里插入图片描述

注意:List是个接口,并不能直接用来实例化
如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。

2、顺序表

在这里插入图片描述

MyArrayList类

请添加图片描述

打印顺序表

请添加图片描述

其中 this.usedSize 代表获取顺序表的有效长度。

在这里插入图片描述

判断是否包含某个元素

请添加图片描述

查找该元素对应的下标请添加图片描述

新增元素Add后插法

请添加图片描述
请添加图片描述

在pos位置新增元素

请添加图片描述

请添加图片描述

获取pos位置的元素

请添加图片描述

请添加图片描述

请添加图片描述

位置pos更新为新值value

请添加图片描述

删除第一次出现的关键字key

请添加图片描述
在这里插入图片描述
特殊情况
在这里插入图片描述

清空顺序表

在这里插入图片描述

3、顺序表–代码

package demo2;

import java.util.Arrays;

public class MyArrayList {
    public int[] elem;
    public int usedSize;//存储了多少个有效的数据
    public static final int DEFAULT_SIZE = 5;

    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }

    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] +" ");
        }
        System.out.println();
    }

    // 获取顺序表长度
    public int size() {
        return this.usedSize;
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;//因为数组 没负数下标
    }

    // 新增元素,默认在数组最后新增
    public void add(int data) {
        if(this.isFull()) {
            resize();
        }

        this.elem[this.usedSize] = data;
        this.usedSize++;
    }
    /**
     * 扩容
     */
    private void resize() {
        this.elem = Arrays.copyOf(this.elem,
                2*this.elem.length);
    }

    /**
     * 判断是否为满
     * @return
     */
    public boolean isFull() {
        /*if(this.usedSize == this.elem.length) {
            return true;
        }
        return false;*/
        return this.usedSize == this.elem.length;
    }

    // 在 pos 位置新增元素 O(N)
    public void add(int pos, int data) {
        checkIndex(pos);
        if(isFull()) {
            resize();
        }
        for (int i = usedSize-1; i >= pos ; i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }

    /**
     * 检查add数据的时候,pos是否是合法的
     * @param pos
     */
    private void checkIndex(int pos) {
        if(pos < 0 || pos > usedSize) {
            throw new IndexOutOfException
                    ("位置不合法,请检查位置的合法性!");
        }
    }

    // 获取 pos 位置的元素
    public int get(int pos) {
        checkGetIndex(pos);
        return elem[pos];
    }

    private void checkGetIndex(int pos) {
        if(pos < 0 || pos >= usedSize) {
            throw new IndexOutOfException
                    ("get获取元素的时候,位置不合法,请检查位置的合法性!");
        }
    }
    // 给 pos 位置的元素设为 value  1
    public void set(int pos, int value) {
        checkIndex(pos);
        elem[pos] = value;
    }

    //删除第一次出现的关键字key O(n)
    public boolean remove(int toRemove) {
        int index = indexOf(toRemove);
        if(index == -1) {
            System.out.println("没有这个数据");
            return false;
        }

        for (int i = index;i < usedSize-1;i++) {
            elem[i] = elem[i+1];
        }
        usedSize --;
        //elem[usedSize] = null;
        // 如果里面是引用类型 那么此时就需要手动置空
        elem[usedSize] = 0;
        return true;
    }

    // 清空顺序表
    public void clear() {
       /*
       for (int i = 0; i < usedSize; i++) {
            elem[i] = null;
        }
        usedSize = 0;
        */
        usedSize = 0;
    }
}


package demo2;

public class Test {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.display();
        myArrayList.clear();

        System.out.println("fdsfsa");

        myArrayList.display();


        /*myArrayList.remove(3);
        myArrayList.display();

        try {
            myArrayList.add(1,99);
        }catch (IndexOutOfException e) {
            e.printStackTrace();
        }
        myArrayList.display();
        System.out.println("============");

        try {
            System.out.println(myArrayList.get(4));
        }catch (IndexOutOfException e) {
            e.printStackTrace();
        }*/

    }
}

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

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

相关文章

第一天总结 之 用户管理界面的实现 之 修改操作 的实现

修改操作 首先 明确 修改操作的前提是 先在页面显示修改前的数据 然后对其进行修改 之后点击提交在页面显示修改前的数据 方法一&#xff1a; 带着数据直接跳转 到添加页面 即在跳转的url后 直接通过&#xff1f;携带数据跳转 缺点&#xff1a; &#xff01;&#xff01;…

6、Ubuntu20的JDKMySQLtomcatRedis安装

安装JDK 这里以安装版本8为例 进入存放jdk目录创建目录 cd /usr/local mkdir jdk cd jdk 把下好的jdk8压缩包拖拽到Ubuntu连接用户下 移动jdk包文件 mv /home/starfish/jdk-8u351-linux-x64.tar.gz . 解压jdk tar -zxvf jdk-8u351-linux-x64.tar.gz cd jdk1.8.0_351/ p…

【C#】C#Process调用外部程序

前言 使用C#调用外部程序&#xff0c;一种是通过Process类&#xff0c;一种是通过命令行&#xff0c;本文主要说一下使用C#中的Process类调用外部程序的方式。 过程&#xff1a; 创建Process对象配置启动选项&#xff08;输入、输出等&#xff09;切换工作目录设置外部程序名…

Java——全排列

题目链接 leetcode在线oj题——全排列 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 题目示例 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] …

Linux防火墙状态查看 | 端口关闭 | 端口开启 | 修改命令

目录 firewall防火墙 【1】查看firewall状态 【2】开启、重启、关闭firewalld服务 【3】查看防火墙规则 【3】 添加指定需要开放的端口&#xff08;开启8088&#xff09; 【4】重载入添加的端口 【5】查询指定端口是否开启成功 firewall防火墙 【1】查看firewall状态 s…

Java日志系统log4j2的使用配置和异步日志使用

目录1. log4j21.1 log4j2介绍1.2 Log4j2入门1.2.1 log4j2(日志门面 日志框架)使用1.2.2 slf4j log4j2使用1.3 Log4j2配置1.4 Log4j2异步日志1.4.1 全局异步AsyncLogger1.4.2 混合异步AsyncLogger1.4.3 AsyncAppender1. log4j2 1.1 log4j2介绍 Apache Log4j2是Log4j的升级版…

IB地理学什么?适合什么人学习?

IB精选&#xff1a;IB地理学什么&#xff1f;快速搞懂自己适不适合修读地理&#xff01; 核心目的IB地理科是一个很特别的科目&#xff0c;目的是要帮助同学掌握一些认识和了解现实世界的技能。这个现实世界包括了两大部分。 第一个部分是自然环境&#xff0c;当中包括生态系统…

你还在恐惧指针吗?点进来,带你全方位深入了解指针

指针是什么&#xff1f; 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。(存放在指针中的值都被当做地址处理) 对于32位的机器&#xff0c;假设有32根地址线&#xff0c;那么假设每根地址线在寻找地址的时候会产生高电平&#xff08;高电压&#xff09;和…

[ZJCTF 2019]NiZhuanSiWei

目录 信息收集 代码审计 第一层 第二层 第三层 信息收集 打开页面又是代码审计 代码如下 <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,…

React + TS + TDD 扫雷游戏学习心得

React TS TDD 扫雷游戏学习心得 试玩地址&#xff1a;https://goldenaarcher.com/minesweeper&#xff0c;stroybook 的地址&#xff1a;https://www.chromatic.com/build?appId63b2530f575ed5942cf105be&number1 测试主要使用 jest&#xff08;mock&#xff09; RTL …

Linux进程控制(进程替换)

目录 一、进程程序替换原理 二、进程替换函数 三、函数实现子进程进程替换 3.1 测试函数 3.2 写时拷贝保证替换后的进程独立性 四、自我实现一个简单的 shell 五、内置命令 5.1 pwd查询路径本质 5.2 内置命令概念 5.3 自我实现shell Pro 先见见进程替换&#xff1a; …

Unity学习笔记--如何在Unity中把自己的代码打包成dll给别人使用?(纯保姆式教学,看完还不会,今晚八点,来沙城砍我)

目录前言背景步骤一步骤二步骤三步骤四&#xff08;关键&#xff01;&#xff01;&#xff01;&#xff09;步骤五步骤六步骤七步骤八步骤九步骤十总结前言 最近公司放年假了&#xff0c;没什么事做&#xff0c;所以来公司学习&#xff08;蹭吃蹭喝ing&#xff09; 突然记起来…

CSS总结笔记+案例

此文章属于前端篇中的第二节CSS样式 继前期HTML标记语言 CSS总结笔记&#xff1a; 3.CSS样式 css&#xff0c;专门用来“美化”标签。 基础CSS&#xff0c;写简单页面&看懂&改。模块、调整和修改 3.1CSS应用方法 1.在标签上 - 高度和宽度样式&#xff1a; <i…

linux基本功系列之alias命令实战

本文目录 文章目录前言&#x1f680;&#x1f680;&#x1f680;一. alias命令介绍二. 语法格式及常用选项三. 参考案例3.1 查看系统已经存在的别名3.2 设置别名的操作3.3 取消别名3.4 alias的全局生效和当前用户生效四. 使用命令的注意事项总结前言&#x1f680;&#x1f680;…

行云洞见 | 为什么说云端IDE代表未来趋势?

原文作者&#xff1a;行云创新解决方案架构师 李楠 预知未来最可靠的方法是了解历史&#xff0c;让我们简单回顾下IDE的发展史。 所谓IDE&#xff0c;即集成开发环境&#xff0c;是软件开发人员在他们用于编程的计算机本地安装的应用程序。伴随着计算机编程语言从第一代机器语…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(万用表)】

目录 序言 &#x1f34d;放置虚拟仪器仪表 &#x1f349;万用表 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&#x…

【虹科分享】虹科ATEasy软件,您的测试执行和开发专家!

测试和执行专家 虹科ATEasy是功能测试&#xff0c;自动测试系统&#xff0c;数据采集&#xff0c;过程控制和仪表系统的测试执行和快速应用开发框架。虹科ATEasy提供开发&#xff0c;部署和维护软件组件的所有必要工具&#xff0c;包括仪器驱动程序&#xff0c;测试程序&#x…

SGA与PGA的区别

前几天有被别人问到什么是SGA和PGA&#xff0c;说实在的&#xff0c;之前一直搞分布式&#xff0c;已经基本把单机里面的这两个概念忘记的差不多了&#xff0c;不过当时还是根据自己的一点数据库经验说了点七七八八&#xff0c;后来网上查了一下相关说明&#xff0c;发现自己的…

现货黄金与白银现货的区别

黄金与白银同为贵金属&#xff0c;二者均在人类货币史上担当过货币的功能&#xff0c;而现货黄金与白银现货作为其最重要的金融衍生品&#xff0c;都具备良好的收益性、流动性和的可操作性&#xff0c;都是比较理想的投资产品。那么和现货黄金和白银现货的区别在哪里呢?小编认…

C++初学者学习笔记

面向对象的程序设计 初步理解 相比较于面向过程的程序设计来说有更多的封装的函数可以使用&#xff0c;相比较来说会比较方便。但是如何去设计整个程序的思路也是需要一定的训练的。 C 简介 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xf…