上次我们分析了ArrayList,大家都已经了解了分析一个集合的步骤。那接下来,我们继续分析LinkedList。废话不不多说,直接整。
查看LinkedLis成员
1 | /** |
从LinkedList成员中,可以看出Lined内部有两个指针,first(指向第一个节点)与Last(指向最后一个节点)。查看相关Node类声明:
Node类声明
1 | private static class Node<E> { |
Node类中,保存了当前数据元素,上一个节点,及下一个节点。从这里,我们大概了解到了LinkedList的内部结构是链表。
一、添加元素
add(e)方法
1 | public boolean add(E e) { |
add方法内部调用了linkLast(e),继续走linkLast(e)。
查看linkLast(e)方法
1 | void linkLast(E e) { |
当该方法执行是,会初始化一个Node节点保存当前添加元素及上一个节点。如果是第一次执行,该方法,first与Last都会指向该节点。如果不是第一次执行。上个节点的next会指向新添加的节点,且last指向新添加的节点。
addFist(e)方法
addFist(e)中方法直接调用了linkFrist(e)方法,我们直接查看LinkFirst方法:
1 | private void linkFirst(E e) { |
linkFirst方法内部创建了一个新的节点。如果是第一次添加。新节点上个节点为null。如果不是,则新的节点的上个的节点为first原来指向的节点,first指向新添加的节点。
addLast(e)方法原理与addFirst(e)原理差不多,这里就直接跳过了
二、获取元素
get(Index)方法
1 | public E get(int index) { |
get方法先判断时候在有效范围类,如果调用了node(index)方法返回相应元素,继续走node方法。
1 | Node<E> node(int index) { |
该方法内部先判断index的位置是否小于总长度的一半,如果是,则从链表前方遍历,如果不是,则从链表最末尾进行遍历。
三、删除元素
removeFirst()方法
1 | public E removeFirst() { |
removeFirst()方法,先判断当前frist时候为null,如果不是,将first作为参数传入unLinkFirst()方法,查看unLinkFirst方法。
1 | private E unlinkFirst(Node<E> f) { |
unLinkFirst方法将器node中数据置为null,且将frist节点,指向f的下一个节点。并将f的下一个节点的上个节点(也就是f)至为null。
removeLast()方法
1 | public E removeLast() { |
removeLast方法内把Last指向的节点,传入unLikeLast()方法,继续走unLinkLast方法。
1 | private E unlinkLast(Node<E> l) { |
unLinkLast方法内部获取last重写指向Last原节点的上一个节点,同时将Last原节点至为null.
总结
- LinkedList方法内部实现是链表,且内部有fist与last指针控制数据的增加与删除等操作
- LinkedList内部元素是可以重复,且有序的。因为是按照链表进行存储元素的。
- LinkedList线程不安全的,因为其内部添加、删除、等操作,没有进行同步操作。
- LinkedList增删元素速度较快。
最后,附上我写的一个基于Kotlin 仿开眼的项目SimpleEyes(ps: 其实在我之前,已经有很多小朋友开始仿这款应用了,但是我觉得要做就做好。所以我的项目和其他的人应该不同,不仅仅是简单的一个应用。但是,但是。但是。重要的话说三遍。还在开发阶段,不要打我),欢迎大家follow和start