LinkedList

LinkedList是基于链表实现的。链表是一种线性的存储结构,它的一个存储单元里面,除了存放有待存储的数据以外,还存储有其下一个存储单元的地址(下一个存储单元的地址是必要的,有些存储结构还存放有其前一个存储单元的地址),每次查找数据的时候,通过某个存储单元中的下一个存储单元的地址寻找其后面的那个存储单元。


LinkedList是一种有序的可重复双向链表,双向是指:

  1. 链表中任意一个存储单元都可以通过向前或者向后寻址的方式获取到其前一个存储单元和其后一个存储单元;
  2. 链表的尾节点的后一个节点是链表的头结点,链表的头结点的前一个节点是链表的尾节点。

构造器

  1. LinkedList()创建一个空的链表;
  2. LinkedList(Collection<? extends E> collection) 调用第一个构造方法构造一个空的链表,之后通过addAll将c中的元素全部添加到链表中。

常用方法

除了在ArrayListHashSet中了解到的collection的通用方法,add, addAll, clear, contains, size, isEmpty外,LinkedList还有一些更细化的方法:

  • add(E e):在链表后添加一个元素;
    • add(int index, E element):在指定位置插入一个元素;
    • addFirst(E e):在链表头部插入一个元素;
    • addLast(E e):在链表尾部添加一个元素;
  • push(E e):与addFirst方法一致
  • offer(E e):在链表尾部插入一个元素
  • offerFirst(E e):JDK1.6版本之后,在头部添加;
  • offerLast(E e):JDK1.6版本之后,在尾部添加;
  • remove() :移除链表中第一个元素;
    • remove(E e):移除指定元素;
    • removeFirst(E e):删除头,获取元素并删除;
    • removeLast(E e):删除尾;
  • pop():和removeFirst方法一致,删除头;
  • poll():查询并移除第一个元素
    • pollFirst():删除头;
    • pollLast():删除尾;
  • get(int index):按照下标获取元素;
    • getFirst():获取第一个元素;
    • getLast():获取最后一个元素;
  • peek():获取第一个元素,但是不移除;
  • peekFirst():获取第一个元素,但是不移除;
  • peekLast():获取最后一个元素,但是不移除;
    其中,使用getremove方法,若列表为空,则抛出空元素异常,而peekpoll则返回null
例子:
import java.util.LinkedList;

public class Test {

    public static void main(String[] args) {
//        创建一个LinkedList
        LinkedList colors = new LinkedList();
        System.out.println("Initial size of colors: " + colors.size());

//        向LinkedList添加元素
        colors.add("blue");
        colors.add("yellow");
        colors.add("green");
        colors.add("red");
        System.out.println("colors: " + colors);
        System.out.println("colors contains pink: " + colors.contains("pink"));
        colors.addFirst("pink");

//        查询LinkedList第一个元素
        System.out.println("First element of colors: " + colors.getFirst()); // 查询第一个元素但不删除
        System.out.println("First element of colors: " + colors.poll()); // 查询并删除第一个元素
        System.out.println("First element of colors: " + colors.getFirst());
        System.out.println("colors: " + colors);
    }
}

结果:

Initial size of colors: 0
colors: [blue, yellow, green, red]
colors contains pink: false
First element of colors: pink
First element of colors: pink
First element of colors: blue
colors: [blue, yellow, green, red]

遍历

LinkedListArrayList相同,也可使用以下三种方式遍历:

  1. for循环:
for (int i = 0; i < collection.size(); i++) {
    // some code
    // example: collection.get(i);
}
  1. 自动增强的for循环
for (Object obj : collection) {
    // some code
}
  1. 迭代器
Iterator<Object> it = collection.iterator();
while(it.hasNext()){
    // some code
    // example it.next()
}

另外,LinkedList还可以通过removeFisrt, removeLast, pollFisrt, pollLast, 优点是速度快效率高,尤其是remove,缺点是会删除原始数据。如果只是想遍历查询而不删除数据,推荐使用自二中增强的for循环遍历(效率高),不太推荐使用第一种for循环(效率很低)。

例子:

import java.util.Iterator;
import java.util.LinkedList;

public class Test {

    public static void main(String[] args) {
        LinkedList colors = new LinkedList();
        colors.add("blue");
        colors.add("yellow");
        colors.add("green");
        colors.add("red");
        
        System.out.println("==> For Loop Example");
        for (int i = 0; i < colors.size(); i++) {
            System.out.println(colors.get(i));
        }
        
        System.out.println("==> Advance For Loop Example");
        for (Object color : colors) {
            System.out.println(color);
        }
        
        System.out.println("==> Iterator Example");
        Iterator<String> colorsIterator = colors.iterator();
        while (colorsIterator.hasNext()) {
            System.out.println(colorsIterator.next());
        }
        
        System.out.println("==> removeFist Example");
        while (colors.size() != 0) {
            System.out.println(colors.removeFirst());
        }
    }
}

结果:

yellow
green
red
==> Iterator Example
blue
yellow
green
red
==> removeFist Example
blue
yellow
green
red
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 2,631评论 1 12
  • LinkedList LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表...
    史路比阅读 368评论 0 1
  • 上一章进行了ArrayList源码分析,这一章分析一下另一个重要的List集合LinkedList。 Linked...
    wo883721阅读 528评论 0 0
  • 简介 LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构...
    Java面试指南阅读 404评论 0 1
  • 五月中旬的此刻,天气异常的凉爽,在先前几天受不了的高温闷热后,一连半个星期的雨天,姗姗来迟,而后踟蹰不前,温度便...
    宋珪阅读 145评论 0 0