java数据结构YZP专栏-----数组的底层原理

主文章(数据结构的索引目录—进不去就说明我还没写完)
https://blog.csdn.net/grd_java/article/details/122377505
模拟数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
源码(码云):https://gitee.com/yin_zhipeng/data_structures_and_algorithms_in_java.git
数组
  1. 一种线性数据结构,内存地址连续
  2. 由于java无法直接操作内存,但是我们需要理解数组的底层原理
面试点,ArrayList
  1. 面试常问ArrayList,说明它的优势和缺点,我们可能都知道,它查询修改快,插入删除慢,为什么呢?
  2. ArrayList底层就是数组,所以下面介绍的原理,操作,优缺点,都是ArrayList的特点

1. 数组底层原理(Basic principles of Array)

1. 数组用一组连续内存空间,存储一组具有相同类型的数据
  1. 一组连续内存空间
    在这里插入图片描述
  1. 假设上图为内存区,那么必须保证红色格子连续,中间不能有灰色或橙色的格子
  2. 假设最后一个红色格子2,是灰色的格子。那么数组的内存区域不能放在这里,而是整个向下用第三行的橙色格子。必须保证内存空间连续
  1. 存储一组相同类型数据,假设int a[] = new int[5];起始空间为1000, int类型占4字节,那么内存空间如下分配
    在这里插入图片描述
  1. 实际上内存存储的是位,int 4字节 = 32位
如何寻址
  1. 我们知道内存空间是连续的,并且每个数组元素分配的空间,和存储数据类型有关,所以,寻址时,通过首地址1000,向后推算即可
  2. 随机元素寻址
a[i]_address=a[0]_address+(i*4)
  1. 所以,下标从0开始
  2. 连续性分配
  3. 数组元素类型相同

2. 操作原理,时间复杂度

读取和更新
  1. int n = arr[2]; 操作原理为,首地址1000+2*4 = 1008,直接获取1008地址数据
  2. arr[2] = 10; 操作原理为,首地址1000+2*4 = 1008,直接将1008地址数据,修改为10
  3. 因此,时间复杂度都是O(1)
插入元素
  1. 尾部插入,数据实际元素数量小于数组长度情况下,直接把插入元素放在数组末尾空闲位置,等同于更新元素操作。例如arr[6] = 8;,时间复杂度O(1)
    在这里插入图片描述
  2. 中间插入,数据实际元素数量小于数组长度,数组每一元素都有固定下标,需要把插入位置和后面元素后移,再把插入元素放在对应位置上,时间复杂度O(n)
    在这里插入图片描述
  3. 超范围插入,当前数组已满,还想插入,需要进行数组扩容,例如创建新数组,长度是原来2倍,再把旧数组元素复制过去
    在这里插入图片描述
删除
  1. 和插入正好相反,如果删除中间的,后面的元素需要前挪
  2. 一般考虑效率,会采用标记算法,标记要删除的,一次性批量删除,然后往前挪。而不是一个个删除,每删一个,往前挪一次。时间复杂度O(n)
时间复杂度只考虑最坏情况
  1. 所以按最坏情况考虑,插入和删除,都需要涉及元素移动,时间时间复杂度是O(n)
  2. 而查询和修改,时间复杂度都是O(1)
适用场景
  1. 因此,数组这种数据结构,查询和修改效率高
  2. 插入和删除效率低
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值