亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java LinkedList的實現(xiàn)原理圖文詳解

 更新時間:2019年01月11日 14:29:24   作者:qq_43193797  
今天小編就為大家分享一篇關(guān)于Java LinkedList的實現(xiàn)原理圖文詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一、概述

先來看看源碼中的這一段注釋,我們先嘗試從中提取一些信息:

Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null).All of the operations perform as could be expected for a doubly-linked list. Operations that index into the list will traverse the list from the beginning or the end, whichever is closer to the specified index.Note that this implementation is not synchronized. If multiple threads access a linked list concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements; merely setting the value of an element is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the list.

從這段注釋中,我們可以得知 LinkedList 是通過一個雙向鏈表來實現(xiàn)的,它允許插入所有元素,包括 null,同時,它是線程不同步的。如果對雙向鏈表這個數(shù)據(jù)結(jié)構(gòu)很熟悉的話,學(xué)習(xí)LinkedList 就沒什么難度了。下面是雙向鏈表的結(jié)構(gòu):

雙向鏈表每個結(jié)點除了數(shù)據(jù)域之外,還有一個前指針和后指針,分別指向前驅(qū)結(jié)點和后繼結(jié)點(如果有前驅(qū)/后繼的話)。另外,雙向鏈表還有一個 first 指針,指向頭節(jié)點,和 last 指針,指向尾節(jié)點。

二、屬性

接下來看一下 LinkedList 中的屬性:

//鏈表的節(jié)點個數(shù)
transient int size = 0;
//指向頭節(jié)點的指針
transient Node<E> first;
//指向尾節(jié)點的指針
transient Node<E> last;

LinkedList 的屬性非常少,就只有這些。通過這三個屬性,其實我們大概也可以猜測出它是怎么實現(xiàn)的了。

三、方法

1、結(jié)點結(jié)構(gòu)

Node 是在 LinkedList 里定義的一個靜態(tài)內(nèi)部類,它表示鏈表每個節(jié)點的結(jié)構(gòu),包括一個數(shù)據(jù)域 item,一個后置指針 next,一個前置指針 prev。

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、添加元素

對于鏈表這種數(shù)據(jù)結(jié)構(gòu)來說,添加元素的操作無非就是在表頭/表尾插入元素,又或者在指定位置插入元素。因為 LinkedList 有頭指針和尾指針,所以在表頭或表尾進行插入元素只需要 O(1) 的時間,而在指定位置插入元素則需要先遍歷一下鏈表,所以復(fù)雜度為 O(n)。

在表頭添加元素的過程如下:

當(dāng)向表頭插入一個節(jié)點時,很顯然當(dāng)前節(jié)點的前驅(qū)一定為 null,而后繼結(jié)點是 first 指針指向的節(jié)點,當(dāng)然還要修改 first 指針指向新的頭節(jié)點。除此之外,原來的頭節(jié)點變成了第二個節(jié)點,所以還要修改原來頭節(jié)點的前驅(qū)指針,使它指向表頭節(jié)點,源碼的實現(xiàn)如下:

private void linkFirst(E e) {
 final Node<E> f = first;
 //當(dāng)前節(jié)點的前驅(qū)指向 null,后繼指針原來的頭節(jié)點
 final Node<E> newNode = new Node<>(null, e, f);
 //頭指針指向新的頭節(jié)點
 first = newNode;
 //如果原來有頭節(jié)點,則更新原來節(jié)點的前驅(qū)指針,否則更新尾指針
 if (f == null)
 last = newNode;
 else
 f.prev = newNode;
 size++;
 modCount++;
}

在表尾添加元素跟在表頭添加元素大同小異,如圖所示

當(dāng)向表尾插入一個節(jié)點時,很顯然當(dāng)前節(jié)點的后繼一定為 null,而前驅(qū)結(jié)點是 last指針指向的節(jié)點,然后還要修改 last 指針指向新的尾節(jié)點。此外,還要修改原來尾節(jié)點的后繼指針,使它指向新的尾節(jié)點,源碼的實現(xiàn)如下:

void linkLast(E e) {
 final Node<E> l = last;
 //當(dāng)前節(jié)點的前驅(qū)指向尾節(jié)點,后繼指向 null
 final Node<E> newNode = new Node<>(l, e, null);
 //尾指針指向新的尾節(jié)點
 last = newNode;
 //如果原來有尾節(jié)點,則更新原來節(jié)點的后繼指針,否則更新頭指針
 if (l == null)
 first = newNode;
 else
 l.next = newNode;
 size++;
 modCount++;
}

最后,在指定節(jié)點之前插入,如圖所示

當(dāng)向指定節(jié)點之前插入一個節(jié)點時,當(dāng)前節(jié)點的后繼為指定節(jié)點,而前驅(qū)結(jié)點為指定節(jié)點的前驅(qū)節(jié)點。此外,還要修改前驅(qū)節(jié)點的后繼為當(dāng)前節(jié)點,以及后繼節(jié)點的前驅(qū)為當(dāng)前節(jié)點,源碼的實現(xiàn)如下:

void linkBefore(E e, Node<E> succ) {
 // assert succ != null;
 //指定節(jié)點的前驅(qū)
 final Node<E> pred = succ.prev;
 //當(dāng)前節(jié)點的前驅(qū)為指點節(jié)點的前驅(qū),后繼為指定的節(jié)點
 final Node<E> newNode = new Node<>(pred, e, succ);
 //更新指定節(jié)點的前驅(qū)為當(dāng)前節(jié)點
 succ.prev = newNode;
 //更新前驅(qū)節(jié)點的后繼
 if (pred == null)
 first = newNode;
 else
 pred.next = newNode;
 size++;
 modCount++;
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • java設(shè)計模式--建造者模式詳解

    java設(shè)計模式--建造者模式詳解

    這篇文章主要介紹了Java設(shè)計模式之建造者模式,結(jié)合具體實例形式分析了建造者模式的概念、原理、實現(xiàn)方法與相關(guān)使用注意事項,需要的朋友可以參考下
    2021-07-07
  • Spring?使用注解存儲和讀取?Bean對象操作方法

    Spring?使用注解存儲和讀取?Bean對象操作方法

    在?Spring?中,要想更加簡單的實現(xiàn)對?Bean?對象的儲存和使用,其核心就是使用?注解?,本文主要就是演示如何使用注解實現(xiàn)對?Bean?對象的存取操作,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • 如何判斷java是32位的還是64位的

    如何判斷java是32位的還是64位的

    這篇文章主要介紹了如何判斷java是32位的還是64位的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java中hashCode方法與equals方法的用法總結(jié)

    java中hashCode方法與equals方法的用法總結(jié)

    總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內(nèi)的元素是有序的,元素可以重復(fù);后者元素?zé)o序,但元素不可重復(fù)
    2013-10-10
  • Java中的DecimalFormat用法解析

    Java中的DecimalFormat用法解析

    這篇文章主要介紹了Java中的DecimalFormat用法解析,DecimalFormat是Java中用于格式化數(shù)字的類,它提供了一種簡單而靈活的方式來格式化數(shù)字,包括指定小數(shù)位數(shù)、千位分隔符、貨幣符號等,需要的朋友可以參考下
    2023-10-10
  • SpringMVC整合SSM實現(xiàn)異常處理器詳解

    SpringMVC整合SSM實現(xiàn)異常處理器詳解

    SpringMVC是一種基于Java,實現(xiàn)了Web MVC設(shè)計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進行職責(zé)解耦。基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)
    2022-10-10
  • SpringBoot項目集成依賴Mybatis步驟

    SpringBoot項目集成依賴Mybatis步驟

    在本篇文章中小編給大家分享了關(guān)于SpringBoot項目如何集成依賴Mybatis的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-06-06
  • Spring如何在一個事務(wù)中開啟另一個事務(wù)

    Spring如何在一個事務(wù)中開啟另一個事務(wù)

    這篇文章主要介紹了Spring如何在一個事務(wù)中開啟另一個事務(wù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring?Boot?Yaml配置高級用法

    Spring?Boot?Yaml配置高級用法

    這篇文章主要介紹了Spring?Boot?Yaml配置高級用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 如何用java計算兩個時間相差多少小時

    如何用java計算兩個時間相差多少小時

    最近工作中遇到需要計算時間差,下面這篇文章主要給大家介紹了關(guān)于如何用java計算兩個時間相差多少小時的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12

最新評論