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

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

【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉

1.线性表

1.1线性表的概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
如图所示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉

2.顺序表

2.1顺序表的概念

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

2.2顺序表的实现

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

public class MyArrayList {
//定义一个未被初始化的数组elem
    public 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 位置的元素设为 value
    void set(int pos, int value);
    //删除第一次出现的关键字key
    void 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++;
    }
    @Override
    public boolean isFuul() {
        return size == elem.length;
    }

2.3.2打印数组全部内容

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

2.3.3在 pos 位置新增元素

 // 在 pos 位置新增元素
    @Override
    public 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。
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i< elem.length;i++) {
            if(toFind == elem[i]) {
                return true;
            }
        }
        return false;
    }

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

// 查找某个元素对应的位置
    //直接遍历数组然后一一和目标元素比较,有就返回对应的下标,没有就返回-1。
    @Override
    public 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位置的元素
    @Override
    public int get(int pos) {
        //判断pos位置是否合法
        checkPosOfGet(pos);
        //判断这个顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        return elem[pos];
    }

2.3.7判断顺序表是否为空

 //判断顺序表是否为空
    @Override
    public 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
    @Override
    public 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删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。

//删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。
    @Override
    public 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
    @Override
    public int size() {
        return this.size;
    }

2.3.11清空顺序表

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

3.ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉
【说明】

  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);
    }

结果显示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉
4.2.2将目标值插到指定index位置

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

结果显示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉
4.2.3删除 index 位置元素

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

结果显示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉
4.2.4获取下标 index 位置元素

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

结果显示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉

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)+" ");
        }
    }

结果显示:
【数据结构】从顺序表到ArrayList类,数据结构,java,开发语言,spring,数据挖掘,人工智能,计算机视觉
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,开发语言,spring,数据挖掘,人工智能,计算机视觉
最后,ArrayList是一个动态类型的顺序表,不够空间会自动扩容。

好久没更新了,在这我向我的老铁们道个歉,从今天开始更新关于java的数据结构的内容,希望大家多多支持。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹文章来源地址https://www.toymoban.com/news/detail-821003.html

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

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

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

相关文章

  • 【数据结构(二)】顺序表与ArrayList

    ❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力

    2024年04月12日
    浏览(26)
  • 数据结构 模拟实现ArrayList顺序表

    目录 一、顺序表中的接口 二、顺序表中的方法实现 (1)display方法 (2)add方法 1、不指定下标位置插入 2、指定下标位置插入 (3)contains方法 (4)indexOf方法 (5)get方法 (6)set方法 (7)remove方法 (8)size方法 (9)clear方法 三、最终代码 代码如下: 以上的方法就是我们

    2024年02月04日
    浏览(37)
  • Collection与数据结构 顺序表与ArrayList

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

    2024年04月13日
    浏览(33)
  • 【Java--数据结构】模拟实现ArrayList

    欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素  pos不合法异常 判断和查找元素 获取和更新元素 删除元素和清空顺序

    2024年04月25日
    浏览(26)
  • Java 中数据结构ArrayList的用法

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所

    2024年02月10日
    浏览(33)
  • 探索Java集合框架—数据结构、ArrayList集合

    Java集合的使用相信大家都已经非常得心应手,但是我们怎么做到知其然,更知其所以然这种出神入化的境界呢?我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路方案 数据结构是什么? 数据结构可以分为线性和非线性两种数据结构 线性数据结构: 非

    2024年02月10日
    浏览(31)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(37)
  • java八股文面试[数据结构]——ArrayList和LinkedList区别

      ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add

    2024年02月11日
    浏览(38)
  • 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

    🍃 数据结构是 计算机 存储 、 组织 数据的方式 🎉 线性 结构 线性表(数组、链表、栈、队列、哈希表) 🎉 树形 结构 二叉树 AVL 树 红黑树 B 树 堆 Trie 哈夫曼树 并查集 🎉 图形 结构 邻接矩阵 邻接表 🎁 线性表是具有 n 个 相同类型元素 的有限 序列 (n = 0) a1 是首节点

    2024年02月10日
    浏览(63)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包