数组可能对于每个编程语言来说,是基本的数据类型.
什么是数组?
数组就是线性表数据结构,它用一块连续的内存空间,来存储一组具有相同的类型数据.
关键点:1. 线 性 表 线性表 线性表 2. 连 续 空 间 连续空间 连续空间 3. 相 同 类 型 的 数 据 相同类型的数据 相同类型的数据
常见的线性表结构包括:数组,链表,队列,栈.使用一个数据结构,要清楚其特性,查找的效率,添加与删除数据时候的效率.评判其特性使用时间复杂度和空间复杂度来表示.
1.查询
数组查询是非常高效的,为什么非常高效.归根结底是跟其存储的方式有关系的.因为在内存中是连续存储的,所以查询的时候非常的高效时间复杂度为O(1)看下寻址公式: a [ i ] = b a s e _ a d d r e s s + i ∗ d a t a _ t y p e _ s i z e a[i]=base\_address+i*data\_type\_size a[i]=base_address+i∗data_type_size
- data_type_size是存储的数据所占的字节int为4个字节
- base_address是最开始的位置的地址值
2.插入
如果插入到尾部,在不超过设置的初始长度时候,不需要进行数据移动,如果插入为第k-1个位置,那么就将k后面的数据全部向后移动一位.这样最好的复杂度为O(1),最坏的情况是插入到第一个位置时间复杂度为O(n),这样做是为了保证在内存中地址是连续的.
3.删除
与插入也是同理的.最好的时间复杂度为O(1),最坏的时间复杂度为O(n),平均时间复杂度是O(1+2+…+n)当n足够大的时候表示为O(n)
4.注意
java中数组初始化的时候要指定其大小,这样从内存中好分配空间.
还要注意角标越界的问题.
5.容器
java中存在一些容器ArrayList 底层实现就是基于数组,容器的好处是它实现了动态扩容,每次扩容为原来的1.5倍.容器不能存储基本类型,只能存储包装类.如(Integer,Long…)