基础数据结构 - 数组

一、什么是数组

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

线性表:数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。除了数组,链表、队列、栈等也是线性表。

这里提到了线性表,自然有非线性表:数据之间并不是简单的前后关系。比如二叉树、堆、图等。

二、数组的特点

数组的特点,包括优点和缺点都基于一个限制条件:数组需要使用一组连续的内存空间

数组需要预先指定大小,用来预先申请内存空间。

由于是连续的内存空间,所以根据寻址公式: a[i]_address = base_address + i * data_type_size ,数组能支持在O(1)的时间复杂度下按下标随机访问某个数组元素。

也正是因为要维持连续的内存空间这一限制条件,插入和删除都需要移动一部分元素,比较低效。

三、数组 vs ArrayList

ArrayList是JDK对Array的高级封装,主要处理了底层Array长度不足时的动态扩容问题。看起来就好像在使用一个无限长的数组一样。

既然ArrayList这么方便,那什么时候我们会选择数组而不是ArrayList?

  1. 由于ArrayList无法存储基本类型,如int、long等,使用时需要封装为为 Integer、Long 类,就算有自动拆装箱能使我们基本不用关心这一限制,但毕竟是 Autoboxing、Unboxing 是有性能消耗的。或者希望使用基本类型,并且对性能有极高的要求,可以选用数组。
  2. 数据规模大小已知的一些简单场景,也可以使用数组。