1.数组中的概念:是一种线性表数据结构,使用连续的内存空间来存储类型相同的数据。
(1)线性表:数据排列成一种线形结构 ,如(数组,链表,栈,队列)。非线性表:(树,图,堆)
2.数组是如何实现根据下标索引随机访问数据元素的 ?
数组支持随机访问,根据数组下标随机访问的时间复杂度为O(1),而不是说访问数组的时间复杂度为O(1),因为即使为排好序的数组,采用二分查找算法,时间复杂度也是O(logn)。
因为数组采用的是连续的内存存储空间,所以在数组中间插入和删除数据元素时,之后的元素会进行搬移工作。
以int 类型的数组为例:int [ ] array = new int [10] ; 假设 该数组中的第一个元素的地址为 1000 ,记为 base_address
data_type_size 为数组中每个元素所占内存的大小 ,如:int 类型的数据 占4个字节。
所以随机访问数组中某一个元素的寻址公式为:a[ i ]_address = base_address + i * data_type_size
3. 改进数组中低效的“插入”和“删除”操作的方法:
(1)插入:前提条件(不需要关注数组中元素的顺序时):例如 需要将一个新的元素插入到第k个元素的位置,为了避免k和k之后的元素全都向后移动,可以将第k个元素移动到数组的最后一位,然后将新的元素插入到第k个元素的位置
基于这种操作,在第k个位置插入新的元素的时间复杂度为O(1),在快速排序中也有用到这种思想。
(2)删除数据时:前提条件(不要求数组中数据的连续性):因为在数组中间某一个位置执行删除操作的话,每执行一次都会移动一次数据,对性能产生影响,如果我们可以采用将多次删除操作集中处理的话,
例如 如果想要删除 a b c 三个元素,那么我们可以先记录下来需要删除的数据,当数据的空间不足时,在执行一个总的删除操作,效率会有所提高。
这种操作也是采用到了JVM GC 中的标记清除算法。
4. 数组的访问越界问题:
例如 一个数组 arr[] 中 有三个元素,但是访问了第四个元素,那么程序是否报错取决于编译器,比如在C语言中,程序会出现无限循环的状态,但是在Java中,就会出现数组索引越界异常。
5. 使用Java中容器和基础数组的场合:
Java中基于数组实现的容器,如 ArrayList ,他在底层封装了数组的动态扩容,添加和删除操作,如果在进行业务开发中使用ArrayList时,如果可以提前确定数组的容量,那么在初始化时,尽量声明容器的容量,避免频繁的扩容操作。如果时进行底层的功能开发,那么采用基础的数组比较好。