数据结构之顺序表

今天不学习,明天变垃圾

线性表是集合中的每个元素间有线性关系且是顺序存储的一种数据结构。有线性关系的顺序存储结构又分为逻辑上的顺序存储结构(比如链表)和物理上的顺序存储结构(比如顺序表),本章篇幅中着重讲解顺序表。

什么是顺序表?

顺序表是为了解决数组内存利用率低下而被设计出来的一种数据结构,它所有元素按照一定的循序存储到内存中某一块连续存储空间中,并且元素与元素之间不允许有空值。

下面具体来研究顺序表ArrayList 的具体实现。

ArrayList继承关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ArrayList继承AbstractList,并实现List、RandomAccess(随机存储)、Cloneable(克隆)、Serializable(序列化)接口。因此它具备List接口所有功能,具体如上图所示。

ArrayList构造函数分析
在这里插入图片描述

从上述源码可以看出,ArrayList 底层是用数组保存数据,并且这个数组在声明ArrayList 的时候就已经赋值一个空数组。当然还有一种指定数组长度的初始化方式。

ArrayList 数据操作方式分析

  • 增。 ArrayList 添加数据有队尾添加和非队尾添加两种区别,当然还有数组扩容这一重要内容。

    • 数据扩容。
      在这里插入图片描述
      在这里插入图片描述

      由上面两张图中可以看出,当数组是一个长度为0的空数组时,会重新初始化一个长度为10的数组,后续需要扩容每一次都增长为原先数组长度的1.5倍。

    • 队尾添加。
      在这里插入图片描述

      判断数组长度和数组扩容后,往队尾 size 处添加数据,添加完后数组长度加一.。

    • 非队尾添加。
      在这里插入图片描述
      在这里插入图片描述

      需要注意的是:使用该方法添加数据,需要判断数组越界问题。从源码可以看出,插入数据之前需要使用arraycopy 复制移动数据,把从index位置开始到队尾的数据复制并且往后移动一位,把index位置空出来后插入新数据。

  • 删。 ArrayList 删除数据有两种方式,一种是直接根据下标删除。另外一种是根据具体数据去删除。

    • 根据下标删除。
      在这里插入图片描述在这里插入图片描述

      先判断数组越界,接下来把index后面的数据复制往前移动一位,并把ArrayList size减一,队尾数据置空。

    • 根据数据删除。 需要循环遍历数组,找到数据下标,接下来根据下标删除。可以看出这种方式效率比较低。

  • 改。 ArrayList 支持随机访问,存取效率非常高。
    在这里插入图片描述

  • 查。 ArrayList 支持随机访问,访问效率非常高。
    在这里插入图片描述

经过上述分析,相信各位已经非常清楚明白ArrayList 的优缺点所在。

  • 优点

    • 存储空间连续,支持随机访问,读取效率非常高。
    • 队尾增加删除效率高。
  • 缺点

    • 线性存储结构,存储空间连续。
    • 非队尾的增加删除操作需要大量arraycopy操作,效率非常低下。

适用场景: ArrayList 适用于数据读取修改且没有大量增删操作场景。比如数据库中读取数据展示。
不适用场景: 不适用于有大量增删操作场景。比如数据库读取数据后需要排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值