数组和链表


区别(优缺点)

分点总结

       1、存储,访问方式

????①数组中的元素是连续存储的,可根据索引随机访问元素。

????②链表中的元素不连续,是靠指针指向下一个元素的位置,只能顺序遍历访问,不能随机访问。

??2、结构大小

????①数组大小固定,不可动态改变

????②链表大小可动态变化

??3、增删查

????①数组查询速度快(下标),增删速度慢(需要移动大量元素)

????②链表增删速度快(修改引用),查询速度慢(需要顺序遍历)

?   4、时间复杂度

             ①数组,查询的时间复杂度是O(1),插入和删除时间复杂度是O(n),因为最好是O(1),最差是O(n),所以平均时间复杂度是O(n)/2,既时间复杂度是O(n)。

             ②链表,查询的时间复杂度是O(n),插入和删除的时间复杂度是O(1)。

面试回答

(1)数组中的元素是连续存储的,可根据索引随机访问元素,所以数组查询速度快,查询的时间复杂度是O(1)。单正是因为连续存储,所以插入和删除元素慢,因为得移动后面的所有数据以保持连续性,时间复杂度是O(n)(因为最好是O(1),最差是O(n),所以平均时间复杂度是O(n)/2,既时间复杂度是O(n))。

(2)链表中的元素不连续,是靠指针指向下一个元素的位置,只能顺序遍历访问,所以数组查询速度慢,查询的时间复杂度是O(n)。正式是不连续的,操作指针即可插入和删除元素,所以插入和删除元素快,时间复杂度是O(1)。

常见面试题

ArrayList 和 LinkedList 的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList是实现了基于链表的数据结构。

2.对于添加、删除元素,LinedList比较占优势,因为ArrayList要移动数据。

3.对于遍历和查找元素,ArrayList比较快,因为LinkedList要移动指针。

ArrayList和Vector的区别

首先,这两个类都实现了List接口(List接口继承了Collection接口),是有序集合,相当于一种动态的数组,能够通过索引(元素在List中位置,类似于数组的下标)来访问元素,并且其中的数据是允许重复的。

区别主要包括两个部分:

(1)同步性:

Vector是线程安全的,而ArrayList是非线程安全的,所以如果不是要求线程安全的情况下,最好使用ArrayList,效率会高些。

(2)数据增长:

ArrayList与Vector都有一个初始的容量大小,当存储超过了容量时,就需要增加ArrayList与Vector的存储空间,Vector默认增长原来的一倍,ArrayList增加原来的0.5倍。