【LinkedList】集合

1.1 LinkedList介绍

List是接口,有两个常用实现类

  • ArrayList

  • LinkedList


List有的特点,LinkedList,例如 也是允许有序 ,且可以重复

且大部分方法与ArrayList相似,都是可以通过下标来操作集合数据的

但是也特殊提了操作开头和结尾的方法,getFirst,getLast等方法


基于双向链表实现

1.2 演示API

复制代码
public class Demo2 {
​
    public static void main(String[] args) {
        // 创建对象
        LinkedList<Integer> list = new LinkedList<>( );
​
        // 添加元素
        list.add(3);
        list.add(3);
        list.add(1);
        list.add(4);
        list.add(2);
        System.out.println("list = " + list);
​
        // 在指定下标插入
        list.add(2,5);
        System.out.println("list = " + list);
​
        // E get(int i)
        Integer i = list.get(2);
        System.out.println("i = " + i);
​
        // 根据下标移除
        Integer old = list.remove(2);
        System.out.println("old = " + old);
        System.out.println("list = " + list);
​
        // 迭代
        for(int n:list){
            System.out.println(n );
        }
​
        // 相对arraylist有特殊方法,操作头和尾
        // 在开头添加
        list.addFirst(0);
        // 在结尾添加
        list.addLast(10);
        System.out.println("list = " + list);
​
        // list.removeFirst()
        // list.removeLast()
        // list.getFirst()
        // list.getLast()
​
    }
}

1.3 底层原理

LinkedList底层是通过双向链表实现的

双向链表在内存的特点

  • 链表中每个存储数据的叫做节点(node)

  • 每个节点(node)在空间上不是连续,但是节点内存储了上一个/下一个的位置信息

  • 也有下标,但是因为内存空间上不连续,所以无法通过下标直接定位的,

    • 通过下标找到元素,是判断下标位置,举例开头近,就从头遍历,依次找到它

    • 如果离尾近,从尾倒着遍历,依次找到它

    • 无论怎样,是无法直接定位,只能挨个查找

      复制代码
          Node<E> node(int index) {
              // assert isElementIndex(index);
              if (index < (size >> 1)) {
                  Node<E> x = first;
                  for (int i = 0; i < index; i++)
                      x = x.next;
                  return x;
              } else {
                  Node<E> x = last;
                  for (int i = size - 1; i > index; i--)
                      x = x.prev;
                  return x;
              }
          }
  • 这样解释了,LinkedList为什么提供了操作头xxFirst和尾xxxLast的方法

    • 因为直接操作头和尾不用遍历,直接取值
相关推荐
李李李li24 分钟前
cudnn下载链接
人工智能·windows
小涛不学习12 小时前
手写线程池(从0实现 ThreadPoolExecutor 核心思想)
windows
twc82913 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
wenlonglanying14 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
polaris063015 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
mldlds16 小时前
windows手动配置IP地址与DNS服务器以及netsh端口转发
服务器·windows·tcp/ip
取个名字太难了a16 小时前
DebugActiveProcess 调试流程分析(一)
windows
Java.熵减码农16 小时前
火绒安全软件误杀explorer.exe导致黑屏解决方法
windows
love530love17 小时前
不用聊天软件 OpenClaw 手机浏览器远程访问控制:Tailscale 配置、设备配对与常见问题全解
人工智能·windows·python·智能手机·tailscale·openclaw·远程访问控制
夏末蝉未鸣0117 小时前
Windows环境下载并安装milvus
windows·milvus