数组与链表的区别?
数组
- Java基于数组实现的集合
ArrayList - 数组示意图
- 数组特性举例
数组就像身上编了号站成一排的人,要找第10个人很容易,根据人身上的编号很快就能找到。但插入、删除慢,要望某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快
链表
- Java基于链表实现的集合
LinkedList - 链表示意图
- 链表特性举例
链表就像手牵着手站成一圈的人,要找第10个人不容易,必须从第一个人一个个数过去。但插入、删除快。插入时只要解开两个人的手,并重新牵上新加进来的人的手就可以。删除一样的道理
数组和链表对比
分类 | 数组 | 链表 |
---|---|---|
逻辑结构角度 | 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费 | 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项) |
内存存储角度 | (静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小 | 链表从堆中分配空间, 自由度大但申请管理比较麻烦 |
数组链表对比总结
-
数组静态分配内存,链表动态分配内存;
-
数组在内存中连续,链表不连续;
-
数组元素在栈区,链表元素在堆区;
-
数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
-
数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1);