线性表-数组
引入的一个问题:数组为什么要从0开始编号,而不是从1开始?
答案:下标可以理解为偏移。计算地址的时候可以少一次减法运算。C语言设计者是这样想的,后面就延续下去了。
a[k]_address = base_address + k * type_size
a[k]_address = base_address + (k-1) * type_size
数组的概念:是一种线性表数据结构。用一组连续的内存空间,来存储一组具有相同类型的数据。
引申的概念:
包含关系=>
线性表:数组、链表、队列、栈。线性表的概念:线性表上的数据最多只有前和后两个方向。
非线性表:二叉树、树、堆。
优点:连续的内存空间+相同类型的数据:适合查找,根据下标查找的空间复杂度是O(1)。
缺点:低效的插入和删除。为了保证连续的内存空间,在插入和删除的时候,需要对部分连续的数据进行移动。
什么是容器:语言对数组的一种封装。例如在Java中的ArrayList。
- 对数组的操作细节进行封装
- 支持动态扩容(存储空间不够时,自动扩容1.5倍)
tips: - 对于 ArrayList,事先指定数据的大小,可以省掉很多次内存申请和数据搬移操作。
- 容器无法存储基本类型,比如 int、long,需要封装为Integer、Long类,所以需要装箱和拆箱,会有性能的损耗。如果在使用基本类型的时候,又比较关注性能,可以使用数组。
- 多维数组,使用数组更加直观。