一、数组的特点

1.1、一种线性表数据结构

线性表结构:每个数据最多只有前后两个方向,比如:数组、链表、队列、栈
非线性表结构:数据之间不是简单的前后关系,比如:树、堆、图

1.2、连续的内存空间和相同类型的数据

优点:根据下标随机访问
缺点:插入/删除数据复杂度较高

二、插入数据

2.1、插入数据的平均时间复杂度为O(n)
2.2、一个取巧的方法
image.png

三、删除数据

3.1、删除数据的平均时间复杂度为O(n)
3.2、删除数据的取巧方式
记录数据为已删除,但是并没有真正的删除数据,等内存不够的时候,再真正的删除数据,就像JVM的标记清除垃圾回收算法一样

四、警惕数据越界

C、Javascript语言不干预数组越界
Java、C#会干预数组越界

五、数组对比Java中的ArrayList

ArrayList 的优点:可以将很多数组操作的细节封装起来。比如前面提到的数组插入、删除数据时需要搬移其他数据等。另外,它还有一个优势,就是支持动态扩容。

ArrayList 的缺点:
1.Java ArrayList 无法存储基本类型,比如 int、long,需要封装为 Integer、Long 类,而 Autoboxing、Unboxing 则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。
2. 如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。
3. 当要表示多维数组时,用数组往往会更加直观。比如 Object[][] array;而用容器的话则需要这样定义:ArrayList > array。

总结:对于业务开发,直接使用容器就足够了,省时省力。毕竟损耗那一点点性能,完全不会影响到系统整体的性能。但如果是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选。