数组和链表是两种不同的数据存储方式
比较项 | 数组 | 链表 |
---|---|---|
逻辑结构 | (1)数组在内存中连续; (2)使用数组之前,必须事先固定数组长度,不支持动态改变数组大小;(3) 数组元素增加时,有可能会数组越界;(4) 数组元素减少时,会造成内存浪费;(5)数组增删时需要移动其它元素 | (1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存 |
内存结构 | 数组从栈上分配内存,使用方便,但是自由度小 | 链表从堆上分配内存,自由度大,但是要注意内存泄漏 |
访问效率 | 数组在内存中顺序存储,可通过下标访问,访问效率高 | 链表访问效率低,如果想要访问某个元素,需要从头遍历 |
适用场景 | 当线性表的操作主要是进行查找,很少插入和删除时或者当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组结构 | 链表插入、删除效率高,当线性表要求频繁插入和删除时或者当要求存储的长度变化较大时,且事先无法估量数据规模,,宜采用链表结构 |
arraylist和linkedlist的区别
比较项 | ArrayList | LinkedList |
---|---|---|
底层数据结构 | ArrayList基于动态数组实现,内部维护一个Object数组,默认初始容量为10,当元素数量超过当前容量时会自动扩容。 | LinkedList基于双向链表实现,每个节点包含数据元素和指向前后节点的引用。 |
访问效率 | 由于基于数组,ArrayList支持通过索引快速访问元素,时间复杂度为O(1)。所以随机访问效率高 | 由于基于链表,LinkedList不支持随机访问,需要从头或尾开始遍历,时间复杂度为O(n)。所以顺序访问效率低 |
插入和删除效率 | 在中间或开头插入/删除元素时,需要移动后续元素,时间复杂度为O(n)。所以插入和删除效率低 | 在任意位置插入/删除元素时,只需调整相邻节点的引用,时间复杂度为O(1)。插入和删除效率 |
适用场景 | 需要频繁进行随机访问操作,适合随机访问 | 适合频繁插入和删除 |