• Java LinkedList类详解


    目录

    什么是LinkedList

    LinkedList的使用

    LinkedList的构造

    LinkedList的其他常用方法的介绍

    LinkedList的遍历

    ArrayList和LinkedList的区别


    什么是LinkedList

    LinkList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将结点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高

     在集合框架中,LinkedList也实现了List接口。

    说明:

    1.LinkedList实现了List接口

    2.LinkedList的底层实现了双向链表

    3.LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问

    4.LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)

    5.LinkedList比较适合任意位置的插入场景

    LinkedList的使用

    LinkedList的构造

    方法解释
    LinkedList()无参构造
    public LinkedList(Collection c)

    使用其它集合容器中元素构造List

    举个例子:

    1. import java.util.ArrayList;
    2. import java.util.LinkedList;
    3. import java.util.List;
    4. public class Test {
    5. public static void main(String[] args) {
    6. //构造一个空的LinkedList
    7. List list1 = new LinkedList<>();
    8. //构建一个ArrayList数组,并添加元素
    9. List list2 = new ArrayList<>();
    10. list2.add("JavaSE");
    11. list2.add("JavaWeb");
    12. list2.add("JavaEE");
    13. //使用ArrayList构造LinkedList
    14. List list3 = new LinkedList<>(list2);
    15. }
    16. }

    LinkedList的其他常用方法的介绍

    方法解释
    boolean add(E e)尾插元素e
    void add(int index, E element)将e插入index的位置
    boolean addAll(Collection c)尾插c中的元素
    E remove(int index)删除index位置的元素
    boolean remove(Object o)删除遇到的第一个o
    E get(int index)获取下标index位置的元素
    E set(int index, E element)将下标为index位置元素设置为element
    void clear()清空
    boolean contains(Object o)判断o是否在线性表中
    int indexOf(Object o)返回第一个o所在的下标
    int lastIndexOf(Object o)从后向前找第一个o的位置,返回其下标
    List subList(int fromIndex, int toIndex)截取部分list
    1. import java.util.LinkedList;
    2. import java.util.List;
    3. public class Test {
    4. public static void main(String[] args) {
    5. LinkedList list = new LinkedList<>();
    6. list.add(1);//add(elem)表示尾插
    7. list.add(2);
    8. list.add(3);
    9. list.add(4);
    10. list.add(5);
    11. list.add(6);
    12. list.add(7);
    13. System.out.println(list.size());//7
    14. System.out.println(list);//1 2 3 4 5 6 7
    15. //在起始位置插入零
    16. list.add(0, 0);//add(elem):在index位置插入elem
    17. System.out.println(list);//0 1 2 3 4 5 6 7
    18. list.remove();//remove():删除第一个元素,内部调用的是removeFirst()
    19. list.removeFirst();//removeFirst():删除第一个元素
    20. list.removeLast();//removeLast():删除最后一个元素
    21. list.remove(1);//remove(index):删除index位置的元素
    22. System.out.println(list);//2 4 5 6
    23. //contains(elem):检测elem元素是否存在,如果存在返回true,否则返回false
    24. if(!list.contains(1)) {
    25. list.add(0, 1);
    26. }
    27. list.add(1);
    28. System.out.println(list);//1 2 4 5 6 1
    29. System.out.println(list.indexOf(1));//indexOf(elem):从前往后找到第一个elem的位置
    30. //0
    31. System.out.println(list.lastIndexOf(1));//lastIndexOf(elem):从后向前找第一个1的位置
    32. //5
    33. int elem = list.get(0);
    34. list.set(0, 100);//将index位置的元素设置为elem
    35. System.out.println(list);//100 2 4 5 6 1
    36. //subList(from, to):用list中的(from, to)之间的元素构造一个新的LinkedList返回
    37. List copy = list.subList(0,3);
    38. System.out.println(list);
    39. System.out.println(copy);//100 2 4:注意java中是左闭右开的,所以不包含序号为三的结点
    40. list.clear();//将list中的元素清空
    41. System.out.println(list.size());//0
    42. }
    43. }

    LinkedList的遍历

    1. import java.util.LinkedList;
    2. import java.util.ListIterator;
    3. public class Test {
    4. public static void main(String[] args) {
    5. LinkedList list = new LinkedList<>();
    6. list.add(1);
    7. list.add(2);
    8. list.add(3);
    9. list.add(4);
    10. list.add(5);
    11. list.add(6);
    12. list.add(7);
    13. System.out.println(list.size());
    14. //foreach遍历
    15. for(int e : list) {
    16. System.out.print(e + " ");
    17. }
    18. System.out.println();
    19. //使用迭代器进行遍历-正向遍历
    20. ListIterator it = list.listIterator();
    21. while(it.hasNext()) {
    22. System.out.print(it.next() + " ");
    23. }
    24. System.out.println();
    25. //使用反向迭代器-反向遍历
    26. ListIterator rit = list.listIterator(list.size());
    27. while(rit.hasPrevious()) {
    28. System.out.print(rit.previous() + " ");
    29. }
    30. System.out.println();
    31. }
    32. }

    补充:迭代器的是使用

    1. import java.util.ArrayList;
    2. import java.util.Iterator;
    3. import java.util.List;
    4. public class IteratorTest {
    5. public static void main(String[] args) {
    6. List list = new ArrayList<>();
    7. //添加元素到集合中
    8. Iterator iterator = list.listIterator();
    9. while(iterator.hasNext()) {
    10. String element = iterator.next();
    11. //处理元素
    12. }
    13. iterator.remove();
    14. }
    15. }

    使用流程

    1.获取集合的迭代器对象:通过调用集合的iterator方法获取迭代器对象。例如,对于ArrayList集合,可以使用iterator()方法获取迭代器对象。

    2.遍历集合元素:通过使用迭代器的hasNext()和next()方法来遍历集合中的元素。hasNext()方法用于检查是否还有下一个元素,next()方法用于获取下一个元素的值。

    ArrayList和LinkedList的区别

    不同点ArrayListLinkedList
    存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
    随机访问支持O(1)不支持O(N)
    头插需要搬移元素,效率低O(N)只需修改引用的指向,时间复杂度为O(1)
    插入空间不够时需要扩容没有容量的概念
    应用场景元素高效存储+频繁访问任意位置插入和删除频繁

  • 相关阅读:
    大数据学长面试之OPPO面试题
    MyBatis - 环境配置
    Redis原理:动态字符串SDS
    leetcode118 -- 杨辉三角
    C++ 获取网卡名称和IP地址
    创建交换机、队列以及绑定关系
    Kubernetes入门 十四、存储管理
    使用在线的vscode打开github项目
    day2【代码随想录】移除元素
    Autostrade per l’Italia选择LITESTAR 4D进行隧道照明设计
  • 原文地址:https://blog.csdn.net/asdssadddd/article/details/133151360