首頁 类库下载 java类库 Java-鍊錶LinkedList原始碼原理分析,並且透過LinkedList建構佇列

Java-鍊錶LinkedList原始碼原理分析,並且透過LinkedList建構佇列

Oct 11, 2016 pm 04:27 PM

在這裡我們介紹一下最簡單的鍊錶LinkedList;

看一下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++;
    }
登入後複製

add原理就是:

1.首先取得鍊錶最後一個節點。

2.把新節點插入到最後一個節點之後。

3.linkedList的last屬性重新指向最後一個節點。

4.如果這個節點是第一個節點,之前沒有節點,那麼將linkedList的first的屬性指向新節點;如果不是,則將上一個節點的next屬性指向該節點。

 

使用LinkedList建構先進先出隊列:

offer()方法入隊:使用add()方法插入節點在最後。

public boolean offer(E e) {
        return add(e);
    }
登入後複製

poll()方法出隊:從鍊錶頭開始移出隊列

public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
登入後複製

使用LinkedList建構後進先出隊列:

push()方法入隊:插入節點在first

public void addFirst(E e) {
        linkFirst(e);
    }

private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
        modCount++;
    }
登入後複製

()方法出隊:從鍊錶頭開始移出佇列

public E pop() {
        return removeFirst();
    }

public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }

private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }
登入後複製

最後要注意的是:LinkedList是執行緒不安全的,如果需要執行緒安全那麼請使用synchronized加鎖,或是使用vector,或使用java.util.concurrent套件。

如果需要執行緒遍歷List的時候,避免出現ConcurrentModificationException異常,那麼有3種解決方式。

1.遍歷List的使用synchronized加鎖;

2.使用java.util.concurrent套件下面的CopyOnWriteArrayList,每次使用List時實際上都是使用的List副本。

3.使用Jdk8中foreach方法,不過此方法只接受lambda表達式

list.forEach(item -> {
                    System.out.println("遍历元素:" + item);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
登入後複製


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24