Go数组底层存读原理,跟链表区别

数组与链表:
数组:
数组的地址通过数组名来获取;
数组的第一个元素的地址就是数组地址。
数组各个元素间隔是依据数组的类型决定,比如int64间隔8个,int32间隔4个。
数组的特点:
在内存中,数组是一块连续的区域,数组需要预留空间,使用前先申请占内存的大小,可能造成内存空间的浪费。比如:申请十个元素,只插入6个元素,其余位置就浪费,如果插入11个元素,第11个元素就插入不了,或者重新找个新数组

插入和删除效率低:
插入数据时,这个后面的数据在内存中要向后移,删除数据时,这个数据后面的数据要向前移动。随机读取率很高,因为数组是连续的,知道每个数据的内存地址,可以直接找到地址对应的数据。但不利于扩展,数组定义空间不够时,需要重新定义数组。
数组的读取、赋值底层详解:
我们在读取第i个元素或者给第i个元素赋值时,先要算出i元素的地址,即首地址+i乘4,4:代表每个元素占四个字节(实际根据元素类型决定)},比如:首地址为01019580h,即为第0个元素的地址(01019580h+0乘4),那第1个元素地址为01019584h=01019580h+1乘4,……第4个元素地址为01019590h=01019580h+4*4,赋值时: 用mov指令将数据值传递到该地址开始4个字节中存放。读值时: 通过该地址值获取对应内存地址内存储的值。

链表的特点:
在内存中可以存在任何地方,不要求连续,每个数据保存了下一个数据的内存地址,增加、删除数据很容易,只需要把要增加数据的地址告诉该位置前面的元素,然后把该位置之前的元素的地址存到新数据里就行了。
查询效率低:不具有随机访问性,要查某个元素,必须从链表第一个元素访问找起,然后根据第一个元素保存的下一个元素的地址找到下一个元素,以此类推。

数组优点:
随机访问行强,查询速度快缺点:插入、删除效率低。内存要求高,必须有足够的连续的内存空间可能浪费内存数组大学固定,不能动态扩展链表的优点:插入速度快,内存利用率高,不会浪费内存,没有大小固定,拓展灵活。

数组缺点:
不能随机查找,必须从第一个开始遍历,查找效率低。

为什么数组变量快:
cpu缓冲会把一片连续的内存空间读入,数组结构是连续的内存地址,所以数组的全部或部分元素是被放到CPU缓存中,而链表的节点是分散在堆空间中,这时候cpu缓存帮不上忙 只能去内存读取,而缓存的速度要比内存快。

双向链表:
go语言中链表的实现是在标准库container/list代码包中代码包有两个公开的程序实体:
List:实现了一个双向链表。
Element:代表了链表中的元素结构。
这两个实体都有各自的内置函数,比如:Element有Next()、Prev()、Value。List有Back()、Front()、PushBack()、InsertBefore()、Init()、Remove()、MoveToFront()……等等,链表开箱即用.

Ring环形链表
与List区别:
1、new函数功能不同,在创建初始化ring时,我们可以指定它包含的元素数量,对于list来说,不能这样做。
2、维度不同,一个ring类型的值,严格讲,只代表其所属的循环链表中的一个元素,而list类型的值代表一个完整的链表。
3、零值不同,list的零值是长度为0的链表,通过var r ring.Ring声明的r是长度为1的循环链表。
4、复杂度不同:list的len方法复杂度为O(1).Ring的len方法的算法复杂度为O(N).

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心码农1号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值