数组
前言
数组如何实现随机访问?
答:数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。其中最关键的点在于连续的内存空间和相同类型的数据。正是因为这两个关键点才拥有了随机访问的特性。
线性表和非线性表是什么?
答:线性表就是将数据排成像线一样的结构。每个线性表中最多只有向前和向后两个方向。链表、队列和栈都是线性表结构。
非线性表中的数据不是简单的前后关系,二叉树、堆和图都是非线性的。
1.数组的插入操作
- 对于有序数组的插入我们是了解的,平均情况下的时间复杂度是O(n)。
- 如果数组内的数据没有任何规律可言,数组只是当作是存储数据的集合,此时将数据插入到第k个位置,为了避免大规模的数据迁移,最简单的办法是将第k个数据直接移到数组元素的最后,然后把新的元素放入到第k个位置。
2.数组的删除操作
- 在一些情况下,我们可以将多次删除操作集中到一起执行。我们可以先记录下已经删除的数据,当存储空间不够使,再触发一次真正的删除操作。这种方法与jvm标记清除垃圾回收算法类似.
- 数组越界问题
{
int i = 0;
int arr[3] = {0};
for(;i<=3;i++)
{
arr[i]=0;
print("hello");
}
return 0
}
上面的代码会无限输出hello,因为代码书写错误在访问a[3] 会越界,此时a[3]与i的内存区域是相同的。因此代码会无限循环。但是java本身会做越界检查。
*数组越界在c语言中是一种未决行为,并没有规定数组访问越界时编译器该如何工作。只要是数组偏移后的内存地址是可用的,那么程序就不会报任何错误。
3.容器与数组
- arraylist的优点是支持动态扩容,每次存储空间不够的时候,它都会自动扩容1.5倍左右。由于消耗时间所有最好事先指定数据大小
- arraylist 无法存储基本类型都需要封装成integer、long类。在自动装箱的过程中有一定性能消耗。特别关注性能时,要选用数组。
- 多维数组时 Object[][] array更加直观,而使用容器就需要这样定义 ArrayList array.