数组常见知识点

数组

前言

数组如何实现随机访问?

答:数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。其中最关键的点在于连续的内存空间和相同类型的数据。正是因为这两个关键点才拥有了随机访问的特性。

线性表和非线性表是什么?

答:线性表就是将数据排成像线一样的结构。每个线性表中最多只有向前和向后两个方向。链表、队列和栈都是线性表结构。
非线性表中的数据不是简单的前后关系,二叉树、堆和图都是非线性的。

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.

猜你喜欢

转载自blog.csdn.net/qq_22152499/article/details/89069399