zoukankan      html  css  js  c++  java
  • 【Java基础】LinkedList工作原理

    1. LinkedList

      以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。按下标访问元素-get(i)、set(i,e)要悲剧的部分遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。插入、删除元素时修改前后节点的指针即可,不再需要复制移动。但还是要部分遍历链表的指针才能移动到下标所指的位置。只有在链表两头的操作-add()、addFirst()、removeLast()或用iterator()上的remove()倒能省掉指针的移动。

      // Node为LinkedList的内部类,它定义了存储的元素,上一个元素,下一个元素,这是典型的双向链表的定义方式。
      private static class Node<E> {
          E item;
          Node<E> next;
          Node<E> prev;
      
          Node(Node<E> prev, E element, Node<E> next) {
              this.item = element;
              this.next = next;
              this.prev = prev;
          }
      }
      
    2. 构造方法

      LinkedList提供了两个构造方法:

      • LinkedList():构造一个空的LinkedList

      • LinkedList(Collection<? extends E> c):构造一个包含指定元素的LinkedList

    3. add()

      public boolean add(E e) {
          linkLast(e);
          return true;
      }
      
      void linkLast(E e) {
          final Node<E> l = last;
          // 构造一个新的新节点
          final Node<E> newNode = new Node<>(l, e, null);
          last = newNode;
          // 如果链表是空的,第一个元素就是新建的,如果不是空的,将引用指向新建的节点
          if (l == null)
              first = newNode;
          else
              l.next = newNode;
          size++;
          modCount++; // 容量修改次数分别+1
      }
      

      调用add()方法,将元素追加到链表末尾。除了add()方法,还提供了其他add方法

      • addFirst(E e):插入新元素到链表头部
      • addLast(E e):插入新元素到链表尾部
      • addAll(Collection<? extends E> c):插入新的集合
      • addAll(int index, Collection<? extends E> c):在指定位置插入新的集合
    4. remove()

      // 移除链表中遇到的第一个指定元素,如果列表中不包含,不做任何操作
      public boolean remove(Object o) {
          if (o == null) {
              for (Node<E> x = first; x != null; x = x.next) {
                  if (x.item == null) {
                      unlink(x);
                      return true;
                  }
              }
          } else {
              for (Node<E> x = first; x != null; x = x.next) {
                  if (o.equals(x.item)) {
                      unlink(x);
                      return true;
                  }
              }
          }
          return false;
      }
      
    5. set()

      // 替换指定位置的元素
      public E set(int index, E element) {
          checkElementIndex(index);
          Node<E> x = node(index);
          E oldVal = x.item;
          x.item = element;
          return oldVal;
      }
      
    6. get()

      // 返回指定位置的元素
      public E get(int index) {
          checkElementIndex(index);
          return node(index).item;
      }
      
  • 相关阅读:
    MySQL新建用户,授权,删除用户,修改密码
    apache 压力测试
    wordpress设置导航栏
    关于PYTHON_EGG_CACHE无权限的问题
    ora 32021 设置参数时参数值长度超过255处理办法
    关于四字节字符入库时错误的解决方案(Incorrect string value: 'xF0x9Fx99x8F' for column 'Reply_Content' at row 1)
    Oracle Text Slowly
    Oracle Split Partitions
    下载有时失败
    Sytem 表空间很大
  • 原文地址:https://www.cnblogs.com/lebo0425/p/6504787.html
Copyright © 2011-2022 走看看