集合是面试必问的内容,经过了最近几次面试,主要针对LinkedList遇到了如下面试注意点,特意总结一下。
1、增删改查
● 链表批量增加,是靠for循环遍历原数组,依次执行插入节点操作。对比ArrayList是通过System.arraycopy完成批量增加的。增加一定会修改modCount。
● 通过下标获取某个node 的时候,(add select),会根据index处于前半段还是后半段 进行一个折半,以提升查询效率
● 删也一定会修改modCount。 按下标删,也是先根据index找到Node,然后去链表上unlink掉这个Node。 按元素删,会先去遍历链表寻找是否有该Node,如果有,去链表上unlink掉这个Node。
● 改也是先根据index找到Node,然后替换值。改不修改modCount。
● 查本身就是根据index找到Node。
● 所以它的CRUD操作里,都涉及到根据index去找到Node的操作。
2、遗忘点
LinkedList最大的好处在于头尾和已知节点的插入和删除时间复杂度都是o(1)。但是涉及到先确定位置再操作的情况,则时间复杂度会变为o(n)。
当然,每个节点都需要保留prev和next指针也是经常被吐槽是浪费了空间。
3、offer与add的区别
offer属于 offer in interface Deque
add 属于 add in interface Collection。
当队列为空时候,使用add方法会报错,而offer方法会返回false。
作为List使用时,一般采用add / get方法来 压入/获取对象。
作为Queue使用时,才会采用 offer/poll/take等方法作为链表对象时,offer等方法相对来说没有什么意义这些方法是用于支持队列应用的。