数组的学习笔记

什么是数组?如何实现随机访问?

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

  线性表结构:顺序表(数组)、链表、队列、栈。

  非线性表结构:二叉树、堆、图等。

  连续的内存空间和相同类型的数据 ——> 随机访问(random access)

  a[i]访问地址计算公式:a[i]_address = base_address + i * data_byte_size

 

插入删除操作低效

  原因:保证数据的连续性,需要移动大量数据。

  是否可以优化:

  1、如果数据没有规律,插入第K位数据,则移动K位数据到数组最后,然后在K为插入新数据。同样删除可以把末尾数据移动到要删除的坐标位置。

  2、多次删除动作集中执行,先进行标记删除的位置,批量进行处理。(JVM的标记清除垃圾回收算法的核心思想)

 

数组越界问题(与语言有关)

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
}

  

容器是否能完全代替数组?

  java ArrayList 举例:

  很多数组操作的细节封装。比如:数组插入的搬移数据

  动态扩容【注意:最好事先指定数据大小,可以节省内存申请和数据搬移操作】

  ArrayList无法存储基本数据类型,比如int ,long,需要封装为Integer,Long类。转换操作消耗一定性能。 

什么时候适合使用数组?

  1、基本数据类型,特别关注性能

  2、大小已知,且对数据操作简单,用不到ArrayList的大部分方法时

  3、多为数组可以考虑使用

 

下标为什么从0开始?

1、寻址计算时减少一次减法计算。

2、历史原因。