List
数组:随机访问,随意访问任何元素。a:内存地址,a[0]:这个地址上存的元素,0:相对于起始位置的偏移量,第一个元素。
底层执行:*(a+1),*:取出那个地址上存储的元素,时间复杂度O(1)。
ArrayList:只不过是对数组的包装,因为数组在内存中分配时必须指定长度,一旦分配好后就无法在增加长度。
ArrayList对内部进行了处理,当底层数组填满后,会再分配分配一个更大的新的数组,把数组里的元素拷贝过来,再把原数组抛弃。
使用新的数组作为底层数组来继续存储。
LinkedList:也实现了List接口,也可以按索引访问元素,但底层差别很大,它与数组不同,在每次添加元素时临时专门为它自己分配一个空间。
内存空间的分配是由操作系统完成的,可以说每次分配的位置都是随机的,链表中的每个元素都在完全不同的内存地址上。
怎么找到:保存第一个元素的内存地址。
按索引访问链表元素,时间复杂度为O(n),n为链表的长度,必须一个个遍历,而且链表越长,花的时间越多。
说明:链表不支持随机访问,所以ArrayList就实现了RandomAccess(随机访问接口),而LinkedList没有。