数据类型(1)——数组

先说说有哪些常见的数据类型吧,一般分为两种结构:

(1)线性表结构:数组,链表,栈,队列

数据类型(1)——数组

(2)非线性表结构:树,图,堆

数据类型(1)——数组
这里用了老师的图,看起来比较方便

接下来说说今天的主角——数组

先说说数组的特性

1.上边刚才说了,它属于线性表,即像线段一样只有两个方向。
2.在内存中是占有连续的空间,存储相同的数据类型,且在声明时,确定了大小。

也正是因为这些特性,确定了数组,查找快,增删慢的性质

1.对于明确知道要访问的下标查询时间复杂度是O(1),但对于不知道下标要查找的,最快的2分查找时间复杂度也是O(logn)
为什么查找会这么快,因为内存中是占有连续的空间,首地址是被记录的只需要根据下标可以直接计算出你要访问的地址。
数据类型(1)——数组
计算下标为i数据的地址,便可以直接访问
a[i]_address = base_address + i * data_type_size
2.而增删呢,这个就要分情况了,对于在末尾的增删,只要没有超出数组的大小限制,末尾直接增加的速度也是很快的,时间复杂度是O(1)。但是如果是中间数据,或者首节点的增删,就会涉及大量的数据搬移,因为要保持数据占据的是连续的空间,而数据搬移就会消耗大量的时间时间复杂度是O(n)。平均来说数组的增删时间复杂度是O(n)。

这边再说一个连续删除的操作,如果有10个数据的数组,按顺序存储的1,2,3,4,5,6,现在要求把1,2,3都删除掉,怎么做效率最高呢?
为了避免4,5,6这几个数据会被搬移三次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

这就是JVM标记清除垃圾回收算法的核心思想。