JAVASE->数据结构|顺序表底层逻辑

这篇具有很好参考价值的文章主要介绍了JAVASE->数据结构|顺序表底层逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:再无B~U~G-CSDN博客

目标:
1. 什么是 List
2. List 常见接口介绍
3. List 的使用
本章主要学习顺序表底层逻辑,大致是一样的,不差多少。

 1. 什么是List

在集合框架中,List是一个接口,继承自Collection

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示: 

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

Iterable 也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:
JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

List 的官方文档  

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

2. 常见接口介绍

 List中提供了好的方法,具体如下:

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

虽然方法比较多,但是常用方法如下:
方法
解释
boolean add (E e)
尾插 e
void add (int index, E element)
e 插入到 index 位置
boolean addAll (Collection<? extends E> 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<E> subList (int fromIndex, int toIndex)
截取部分 list

3.简单实现List顺序表的底层逻辑

目的:为了更加清楚的了解顺序表的使用

相应的级别关系:

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

把所有的顺序表方法都定义在IList接口:

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

这里不带多讲,结构上跟c语言差不多。

我们说一下异常这一块:

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

梳理一下异常的应用,比如说:

JAVASE->数据结构|顺序表底层逻辑,java数据结构,数据结构

实现代码:

相应的解释代码里面都有:

 src/arrayList/IList接口

package arrayList;

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 位置的元素设为 value -> 更新
    void set(int pos, int value);

    //删除第一次出现的关键字key
    void remove(int toRemove);

    // 获取顺序表长度
    int size();

    // 清空顺序表
    void clear();

    // 打印顺序表,
    // 注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    void display();
}

src/arrayList/MyArrayList类

package arrayList;

import java.util.Arrays;

public class MyArrayList implements IList {

    public int[] elem;
    public int usedSize;

    //调用构造方法,初始化顺序表长度
    public MyArrayList() {
        this.elem = new int[2];
    }
    //判断顺序表满不满
    public boolean isFull() {
        return elem.length == usedSize;
    }

    //添加一个元素
    @Override
    public void add(int data) {
        if (isFull()) {
            elem = Arrays.copyOf(elem, 2 * elem.length);
        }
        this.elem[usedSize] = data;
        this.usedSize++;
    }


    //该方法来 判断 添加元素时 pos是否合法
    private void checkPosOfAdd(int pos) throws PosNotLegalException {
        if (pos < 0 || pos > usedSize) {
            throw new PosNotLegalException("pos位置不合法!");
        }
    }

    // 在 pos 下标位置新增元素
    @Override
    public void add(int pos, int data) {
        //判断是不是正确引用
        try {
            checkPosOfAdd(pos);
        } catch (PosNotLegalException e) {
            e.printStackTrace();
        }
        if (isFull()) {
            //扩容
            elem = Arrays.copyOf(elem, 2 * elem.length);
        }
        //移动元素
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        this.usedSize++;
    }

    //判断顺序表是否有改元素
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找某个元素对应的下标位置
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //判断pos位置是否合法
    private void checkPosOfGetAndSet(int pos) throws PosNotLegalException{
        if(pos < 0 || pos >= usedSize) {
            throw new PosNotLegalException("get/set获取元素的时候" +
                    "pos位置不合法!");
        }
    }
    // 获取 pos 位置的元素
    @Override
    public int get(int pos) {
        //判断pos位置是否合法
        try {
            checkPosOfGetAndSet(pos);
        }catch (ClassCastException e){
            e.printStackTrace();
        }
        return this.elem[pos];
    }

    // 给 pos 位置的元素设为 value -> 更新
    @Override
    public void set(int pos, int value) {
        //判断pos位置是否合法
        try {
            checkPosOfGetAndSet(pos);
        }catch (ClassCastException e){
            e.printStackTrace();
        }
        this.elem[pos] = value;
    }

    //删除第一次出现的关键字key
    @Override
    public void remove(int toRemove) {
        //1、要查找是否存在要删除的关键字 toRemove
        int pos = indexOf(toRemove);
        if(pos == -1) {
            System.out.println("没有要删除的数字!");
            return;
        }
        for (int i = pos; i < usedSize-1; i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;
    }

    //返回数据长度
    @Override
    public int size() {
        return this.usedSize;
    }

    //释放顺序表
    @Override
    public void clear() {
        this.elem = null;
        this.usedSize = 0;
    }
    //打印顺序表
    @Override
    public void display() {
        System.out.print("[ ");
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");

        }
        System.out.println("]");
    }
}

src/arrayList/PosNotLegalException类

package arrayList;

public class PosNotLegalException extends RuntimeException{
    //不带参数的构造方法
    public PosNotLegalException() {

    }
    //带参数的构造方法
    public PosNotLegalException(String msg) {
        super(msg);
    }

}


src/arrayList/Test测试类

package arrayList;

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

//        list.add(1,24);
//        boolean temp = list.contains(24);
//        if(temp){
//            System.out.println("有");
//        }else{
//            System.out.println("没有");
//        }
        // 打印链表
        list.display();
//        int is =list.indexOf(2);
//        if (is >= 0) {
//            System.out.println("有,在下标:" + is);
//        } else {
//            System.out.println("没有");
//        }

        // 获取 pos 位置的元素
//        int a = list.get(3);
//        System.out.println(a);
//        list.set(2, 6);
//        System.out.println(a);
        list.remove(3);
        // 打印链表
        list.display();

    }
}

今天就到这里了,感谢观看。文章来源地址https://www.toymoban.com/news/detail-861774.html

到了这里,关于JAVASE->数据结构|顺序表底层逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaSE专栏48】Java集合类ArrayList解析,这个动态数组数据结构你了解吗?

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 Java 中集合类 ArrayList 的语法、使用说明和应用场景,并给出了样例代码。

    2024年02月16日
    浏览(60)
  • [JAVA数据结构]顺序表ArrayList

    目录 1.线性表 2.顺序表 3.ArrayList简介 4.ArrayList的使用  4.1ArrayList的构造方法 4.2ArrayList的常用操作 4.3ArrayList的遍历方法 4.4ArrayList的扩容机制 5.ArrayList的具体运用 ArrayList是一种基于数组的数据结构,是线性表的一种,也是顺序表。 通俗来说,线性表是一种线性结构,在逻辑上

    2023年04月26日
    浏览(41)
  • 《Java数据结构入门》顺序表详解

     大家好,我是小鱼儿 目录 顺序表介绍: 顺序表的手动实现 顺序表功能接口概览 基本功能的实现 四大功能 一、增加数据  二、删除数据 三、查找数据 四、修改数据  总代码 MyArraysList.java  Test.java 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一

    2023年04月18日
    浏览(33)
  • 数据结构 之 顺序表 ArrayList (Java)

    🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!! 🌈个人主页: AUGENSTERN_dc 🔥个人专栏: C语言  |  Java | 数据结构 ⭐个

    2024年03月17日
    浏览(34)
  • 用java以数组为底层数据结构创建自己的栈

    栈可以解决什么问题呢: 1.括号匹配问题 2.递归 3.表达式求值问题 首先明确栈的功能: 1.入栈:给底层数组的尾部插入元素相当于入栈 2.出栈:把底层数组的最后一个元素提出来相当于出栈 3.获取栈长度:获取size 4.判断栈是否为空:底层数组size==0则为空 5.获取栈顶:返回底层

    2024年01月20日
    浏览(43)
  • 【Java】实现顺序表基本的操作(数据结构)

    在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构

    2024年02月03日
    浏览(52)
  • 数据结构(Java实现)-ArrayList与顺序表

    什么是List List是一个接口,继承自Collection。 List的使用 List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 常见的线性表

    2024年02月11日
    浏览(37)
  • 【Java数据结构】顺序表、队列、栈、链表、哈希表

    是一个有类型参数(type parameter)的范型表(generic class) 能够自动调整容量,并且不需要写额外的代码 存放数据使用数组但是可以编写一些额外的操作来强化为线性表,底层依然采用顺序存储实现的线性表,称为顺序表 创建 常见操作 一旦确认数组列表大小恒定,不再发生

    2024年02月02日
    浏览(44)
  • Hive、HBase对比【相同:HDFS作为底层存储】【区别:①Hive用于离线数据的批处理,Hbase用于实时数据的处理;②Hive是纯逻辑表,无物理存储功能,HBase是物理表,放非结构数据】

    1. Hive是hadoop数据仓库管理工具,严格来说,不是数据库,本身是不存储数据和处理数据的,其依赖于HDFS存储数据,依赖于MapReducer进行数据处理。 2. Hive的优点是学习成本低,可以通过类SQL语句(HSQL)快速实现简单的MR任务,不必开发专门的MR程序。 3. 由于Hive是依赖于MapRed

    2024年04月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包