2021-05-08-数组:为什么很多编程语言中数组都从0开始编号?

数组是一种线性表结构,利用连续内存存储相同类型数据,支持随机访问。与链表相比,数组插入和删除较慢,但查找快速。数组下标从0开始,便于计算地址。警惕数组越界。Java中ArrayList作为数组容器,提供了动态扩容功能。标记清除算法用于垃圾回收,处理效率和内存碎片是其挑战。二维数组内存寻址公式为address=base_address+(i*n+j)*type_size。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组:线性表

  • 数组基本概念

数组(Array)是一种线性表结构,用一串连续的内存空间,存储相同类型的数据。

  • 数组的特点

线性表结构,相同有的链表、队列、栈;

非线性结构有二叉树、堆、图等;

随机访问:

    根据坐标来计算访问地址:内存分配起始地址+坐标*存储数据结构占用空间大小;

  • 数组和链表的区别

链表插入、删除快,时间复杂度O(1);

数组适合查找,根据坐标查找时间复杂度O(1);

优化插入和删除

插入:直接将第K位的数据移到数组尾,再将数据移到第K位;这个是快排的处理思想;

删除:先记录下要删除的数据,每次删除并不是真正的删除,只是记录数据已被删除,当数组没有空间存储多余数据的时候,再执行一次真正的删除,大大减少数据删除导致的位移。这个也是JVM的标记清除垃圾回收的算法。

  • 数组下表为什么从0开始

随机访问少一次运算,减少cpu销售;

jvm是c++开发,沿用c++习惯;

  • 警惕数组越界

  • 容器能否完全代替数组

ArrayList的优势:将数组操作的细节封装起来;支持动态扩容;最好在创建ArrayList的时候制定数组大小;

ArrayList无法存储基本类型,需要封装Integer、Long,自动装箱、拆箱消耗性能,追求性能使用数组;

数据的大小已知,对数组的操作简单,用不到ArrayList;

多维数组的时候,使用Object[]更直观;

  • java垃圾回收算法-标记清除垃圾回收算法

JVM标记清除算法:

大多数主流虚拟机采用可达性分析算法来判断对象是否存活,在标记阶段,会遍历所有 GC ROOTS,将所有 GC ROOTS 可达的对象标记为存活。只有当标记工作完成后,清理工作才会开始。

不足:1.效率问题。标记和清理效率都不高,但是当知道只有少量垃圾产生时会很高效。2.空间问题。会产生不连续的内存空间碎片。

  • 二位数组的内存寻址公式

对于 m * n 的数组,a [ i ][ j ] (i < m,j < n)的地址为:

address = base_address + ( i * n + j) * type_size

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值