《数据结构与算法之美》03——数组

一、概念

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

关键词:

1. 线性表(Linear List),线性表就是数据排成像一条线一样的结构。

 

相对的是,非线性表

 

2. 连续的内存空间和相同类型的数据。

有这两个限制,有一个特性:随机访问。通过内存空间地址来获取数组元素。

二、警惕数组的访问越界问题

C语言为例,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。

JavaC#为例,数组越界时会抛出异常。

三、容器能否完全替换数组

JavaArrayLisit为例(同比C#List),最大的优势是可以将很多数组操作的细节封装起来,并且支持动态扩容。

注意:动态扩容涉及内存申请和数据搬移,如果事先能确定需要存储的灵气大小,最好在创建时就指定数据大小。

相比于容器,数组是否无用武之地?

1. JavaArrayList无法存储基本类型,会涉及到AutoboxingUnboxing,对性能有一定的消耗,如果关注性能,选择数组。

2. 如果数据大小已知,并且对数据的操作非常简单,可直接使用数组。

3. 表示多维数组时,用数组往往会更加直观。

但对于业务开发,直接使用容器就足够了,省时省力。

课后思考:

1. 前面我基于数组的原理引出JVM的标记清除垃圾回收算法的核心理念。我不知道你是否使

Java语言,理解JVM,如果你熟悉,可以在评论区回顾下你理解的标记清除垃圾回收算法。

使用的是C#,一样有GC

有两个阶段:

阶段1Mark-Sweep标记清除阶段

阶段2Compact压缩阶段

 

参考资料:https://kb.cnblogs.com/page/106720/

2. 前面我们讲到一维数组的内存寻址公式,那你可以思考一下,类比一下,二维数组的内存寻址公式是怎样的呢?

a[i][j]_address = base_address + (i * col_count + j) * data_type_size

原文地址:https://www.cnblogs.com/liang24/p/13143426.html