单向链表
双向链表
LinkedList适用于什么场景?
适用于需要频繁插入和删除元素的场景,例如消息聊天系统,一开始并不明确有多少记录,可以在空间满足的情况下不断增加数据
LinkedList的特点有哪些?
链表的优缺点有哪些?
链表的优点:
增删效率比较高。由于链表上的元素在空间存储上内存地址不连续,所以随即增删元素的时候不会有大量元素位移,只需要修改元素指针域指向的位置就行
链表的缺点:
检索效率低。不能通过数学表达式计算被查找元素的内存地址,所以每次查找的时候都是从头节点开始遍历,直到找到位置
底层原理
测试用例:
package List;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("张三1");
list.add("张三2");
list.add("张三3");
list.add("张三4");
list.add("张三5");
//删除元素
list.remove(); //删除第一个节点
list.remove("张三2"); //删除指定元素的节点
list.remove(3); //删除指定位置的节点
list.removeFirst(); //删除第一个节点
list.removeLast(); //删除最后一个节点
//更新元素
list.set(2, "下标为3的元素更新");
//查找元素
list.indexOf("下标为3的元素更新"); //查找某个元素的位置
list.get(3); //查找指定位置的元素
}
}
添加元素——add
在LinkedList的底层维护了一个内部类Node,链表中的每一个节点就是一个一个的Node节点组成
删除元素——remove
当使用remove方法不传任何参数的时候默认是删除链表的第一个元素,需要修改的内容:
如果是空链表,直接报异常
如果不是空链表:
按照元素内容删除,这一步涉及到遍历链表,需要去查找要删除元素所在的节点,查找之后会调用专门用于删除节点的unlink方法
③、删除指定位置的节点——remove(int index)
从上面的例子结果发现:如果删除第一第一个和最后一个节点都不需要遍历
删除第一个节点:修改first指向为第二个节点,第二个节点的前驱指针为null
更新元素——set
在执行Node<E> node(int index) 方法的时候内部会对链表长度右移一位,这是为什么?
其实是一种分治的思想,右移一位相当于链表的长度除以2,根据传入的索引号确定要更新的元素是在链表的前半部分还是后半部分,如果是在链表的前半部分则链表的后半部分不需要在进行遍历,只需要遍历前半部分就可以,能够大大提高效率。
所以我们可以发现当我们要遍历的元素月靠近链表的中间位置,遍历所需要花费的时间越长
查找元素——indexOf、get
在实际场景中如何选择是使用LinkedList还是ArrayList?
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~
原文地址:https://blog.csdn.net/weixin_43319713/article/details/134681372
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_31490.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!