当前位置:  首页>> 技术小册>> Java语言基础10-Java中的集合

4.5.1 概述

  • LinkedList 具备了 List 接口的特性(有序、重复、索引)。
  • LinkedList 地城实现原理是双向链表。
  • LinkedList 的增删速度快、查询慢。
  • LinkedList 是线程不安全的集合,运行速度快。

4.5.2 LinkedList 集合特有方法

  • 元素插入到链表开头:
  1. public void addFirst(E e) {}
  • 元素插入到列表结尾:
  1. public void addLast(E e) {}
  • 获取链表开头的元素:
  1. public E getFirst() {}
  • 获取链表结尾的元素:
  1. public E getLast() {}
  • 移除链表开头的元素:
  1. public E removeFirst() {}
  • 移除链表结尾的元素:
  1. public E removeLast() {}
  • 示例:
  1. package com.github.linkedlist.demo1;
  2. import java.util.LinkedList;
  3. /**
  4. * @author maxiaoke.com
  5. * @version 1.0
  6. */
  7. public class Test {
  8. public static void main(String[] args) {
  9. LinkedList<String> linkedList = new LinkedList<>();
  10. linkedList.add("aa");
  11. linkedList.add("bb");
  12. linkedList.add("cc");
  13. linkedList.add("dd");
  14. System.out.println("linkedList = " + linkedList); // linkedList = [aa, bb, cc, dd]
  15. linkedList.addFirst("你好啊");
  16. System.out.println("linkedList = " + linkedList); // linkedList = [你好啊, aa, bb, cc, dd]
  17. linkedList.addLast("你好呢");
  18. System.out.println("linkedList = " + linkedList); // linkedList = [你好啊, aa, bb, cc, dd, 你好呢]
  19. System.out.println(linkedList.getFirst()); // 你好啊
  20. System.out.println(linkedList.getLast()); // 你好呢
  21. linkedList.removeFirst();
  22. System.out.println("linkedList = " + linkedList); // linkedList = [aa, bb, cc, dd, 你好呢]
  23. linkedList.removeLast();
  24. System.out.println("linkedList = " + linkedList); // linkedList = [aa, bb, cc, dd]
  25. }
  26. }

4.5.3 LinkedList 的类成员变量

  • 集合中存储元素个数的计数器:
  1. transient int size = 0;
  • 第一个元素:
  1. transient Node<E> first;
  • 最后一个元素:
  1. transient Node<E> last;

4.5.4 LinkedList 的成员内部类 Node

  1. // 节点
  2. private static class Node<E> {
  3. E item; // 存储的元素
  4. Node<E> next; // 下一个节点对象
  5. Node<E> prev; // 上一个节点对象
  6. Node(Node<E> prev, E element, Node<E> next) {
  7. this.item = element;
  8. this.next = next;
  9. this.prev = prev;
  10. }
  11. }

4.5.5 LinkedList 类的 add 方法

  1. public boolean add(E e) {
  2. linkLast(e);
  3. return true;
  4. }
  1. void linkLast(E e) {
  2. // 声明新的节点对象 = last
  3. final Node<E> l = last; // l = null
  4. // 创建新的节点对象
  5. final Node<E> newNode = new Node<>(l, e, null);
  6. // 新的节点赋值给最后一个节点
  7. last = newNode;
  8. if (l == null)
  9. // 将新的节点赋值给first
  10. first = newNode;
  11. else
  12. // 将新的节点赋值给最后一个节点的最后
  13. l.next = newNode;
  14. size++;
  15. modCount++;
  16. }

4.5.6 LinkedList 类的 get 方法

  1. public E get(int index) {
  2. checkElementIndex(index);
  3. return node(index).item;
  4. }
  1. Node<E> node(int index) {
  2. // assert isElementIndex(index);
  3. // 索引是否小于长度的一半,二分查找
  4. if (index < (size >> 1)) {
  5. Node<E> x = first;
  6. for (int i = 0; i < index; i++)
  7. x = x.next;
  8. return x;
  9. } else {
  10. Node<E> x = last;
  11. for (int i = size - 1; i > index; i--)
  12. x = x.prev;
  13. return x;
  14. }
  15. }

该分类下的相关小册推荐: