数组是存放到一组连续空间的内存和相同类型的数据,链表可以存放到一组不连续空间。
ArrayList是查询速度比较高,新增 删除效率比较低
LinkedList是查询速度比较慢,需要一个节点一个节点遍历查找,而操作数据则比较快。可分为单链表,双向链表,循环链表
时间复杂度比较
操作 | ArrayList | LinkedList |
头部添加 | O(1) | O(1) |
尾部添加 | O(1) | O(1) |
查找 | O(1) | O(n) |
任意位置添加 | O(n) | O(1) |
删除 | O(n) | O(1) |
大多数变成语言中,数组要从0开始编号:
从数组存储的内存模型上来看,下标最确切的定义应该是偏移(offset),如果用a来表示数组的首地址,a[0]就是偏移为0的位置,
也就是首地址,a[k]表示偏移k个type_size的位置,所以计算a[k]_address = bases_address+k*type_size
如果是从1开始的话 还需要多运行一次-1的操作,对于CPU来说,就是少了一次减法指令。
JVM标记清除算法:
GC最基础的收集算法就是标记-清除算法,如同他们的名字一样,此算法分为标记 清除两个阶段,先标记出需要回收的对象,再统一回收标记的对象,不足之处 1是效率不高,2是产生碎片内存空间。
数组的寻址公式:
一维数组:a[i]_address = base_address+i*type_size
二维数组:假设是m*n a[i,j]=base_address+(i*n+j)type_size
三维数组:假设是m*n*q a[i,j,k]=base_address+(i*n*q+j*q+k)type_size
(多维数组)需要将前面的数组地址加上