一、数组
1.概念
- 数组是一种线性表数据结构,它用一种连续的内存空间,来存储一组具有相同类型的数据。
- 线性表:数组、链表、队列、栈等
- 非线性表:二叉树、堆、图等
2.连续的内存空间和相同类型的数据
- 优点:具有随机范文的特性,根据下标随机访问的时间复杂度为O(1)
- 缺点:低效的插入和删除
- 插入:最好O(1),最坏O(n),平均O(n)
- 插入:数组若无序,插入新的元素时,可以将第K个位置元素移动到数组末尾,把新的元素插入到第K个位置,此时复杂度为O(1)
- 删除:最好(1),最坏O(n),平均O(n)
- 将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作。这也是 JVM 标记除垃圾回收算法的核心思
3.使用数组还是容器
- 数组必须先指定空间的大小,而容器例如ArrayList可以动态的扩容(扩容时比较耗内存,因为涉及到内存申请及数据的搬移)
- 如果要存储基本的数据类型,可以用数组;容器无法存储基本类型,只能存储基本类型的包装类型,这样在装箱拆箱时会损耗性能
- 事先知道数据大小,并且操作简单,可以用数组
- 直观表示多维,可以用数组,例如Object[][],用容器时只能是ArrayList
; - 业务开发一般使用容器,开发框架,追求性能时,优先考虑数组。
4.为什么数组从0开始编号
由于数组是通过寻址公式计算该元素存储的内存地址的
a[i]_address = base_arress+i*data_type_size
如果数组是从1开始计数,那么公式就会变为
a[i]_address = base_arress+(i-1)*data_type_size
对于CPU来说,多了一次减法的指令。当然,还有历史原因,这个自己搜索去。