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

Java的List集合框架之LinkedList詳細(xì)解析

 更新時(shí)間:2023年11月16日 10:17:11   作者:進(jìn)擊的貓  
這篇文章主要介紹了Java的List集合框架之LinkedList詳細(xì)解析,LinkedList底層是內(nèi)部Node類的存儲,prev、next、item值,同時(shí)最外層還有first、last節(jié)點(diǎn),需要的朋友可以參考下

(一)List子父層級:

LinkedList繼承實(shí)現(xiàn)關(guān)系

  • List接口繼承于Collection,Collection繼承Iterable;
  • LIst接口實(shí)現(xiàn)類分為:Vector、ArrayList、LinkedList;

(二)List實(shí)現(xiàn)類

1、LinkedList實(shí)現(xiàn)類

(1)LinkedList底層是內(nèi)部Node類的存儲,prev、next、item值,同時(shí)最外層還有first、last節(jié)點(diǎn);

(2)LinkedList是線程不安全的,多線程環(huán)境會報(bào)并發(fā)修改異常java.util.ConcurrentModificationException。

(3)LinkedList無擴(kuò)容機(jī)制,底層是雙向鏈表結(jié)構(gòu),內(nèi)部是Node結(jié)構(gòu),外部是first、last首尾節(jié)點(diǎn)。

2、常見源碼

(1)構(gòu)造方法:

//無參構(gòu)造,有參構(gòu)造是將一個(gè)LinkedList對象傳入進(jìn)行追加(數(shù)據(jù)復(fù)制)
	public LinkedList() {   }

(2)add方法:

   public boolean add(E e) {
      linkLast(e);//將e以尾插法入鏈表
      return true;
    }
    //新數(shù)據(jù)入鏈表
    void linkLast(E e) {
        final Node<E> l = last;//獲取尾節(jié)點(diǎn)
        final Node<E> newNode = new Node<>(l, e, null);//調(diào)用Node構(gòu)造方法進(jìn)行入鏈表
        last = newNode;//修改最新尾節(jié)點(diǎn)
        if (l == null)//判定是否為第一個(gè)鏈表節(jié)點(diǎn)
            first = newNode;//設(shè)置為第一個(gè)節(jié)點(diǎn)
        else
            l.next = newNode;//將新節(jié)點(diǎn)與舊節(jié)點(diǎn)相連
        size++;//數(shù)量自增
        modCount++;//操作鏈表自增
    }
    //內(nèi)部類Node,用于鏈表底層數(shù)據(jù)存儲
    private static class Node<E> {
        E item;//存儲值類型泛型
        Node<E> next;//下一節(jié)點(diǎn)
        Node<E> prev;//上一節(jié)點(diǎn)
        //基于構(gòu)造方法進(jìn)行鏈表構(gòu)造
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;//當(dāng)前節(jié)點(diǎn)存儲值
            this.next = next;//設(shè)置當(dāng)前新節(jié)點(diǎn)的下一節(jié)點(diǎn)值
            this.prev = prev;//設(shè)置當(dāng)前新節(jié)點(diǎn)的上一節(jié)點(diǎn)值
        }
    }

(3)remove方法:

 //列舉根據(jù)值刪除,不列舉按索引刪除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);//調(diào)用刪除方法
                 return true;
             }
         }
     } else {
         for (Node<E> x = first; x != null; x = x.next) {
             if (o.equals(x.item)) {
                 unlink(x);//調(diào)用刪除方法
                 return true;
             }
         }
     }
     return false;
   }
   //刪除節(jié)點(diǎn)方法,將節(jié)點(diǎn)的前后節(jié)點(diǎn)進(jìn)行連接,然后將自身置空,其中判定首節(jié)點(diǎn)和尾節(jié)點(diǎn)為空處理
   E unlink(Node<E> x) {
       final E element = x.item;//刪除節(jié)點(diǎn)值
       final Node<E> next = x.next;//刪除節(jié)點(diǎn)的下一節(jié)點(diǎn)
       final Node<E> prev = x.prev;//刪除節(jié)點(diǎn)的上一節(jié)點(diǎn)
       if (prev == null) {//上一節(jié)點(diǎn)那為空
           first = next;//設(shè)置新的首節(jié)點(diǎn)
       } else {
           prev.next = next;//將刪節(jié)點(diǎn)的前后鏈接(前節(jié)點(diǎn))
           x.prev = null;//置空當(dāng)前節(jié)點(diǎn)的prev值
       }
       if (next == null) {//刪除節(jié)點(diǎn)下一節(jié)點(diǎn)為空
           last = prev;//設(shè)置新的尾節(jié)點(diǎn)
       } else {
           next.prev = prev;//刪除節(jié)點(diǎn)的前后鏈接(針對后節(jié)點(diǎn))
           x.next = null;//置空當(dāng)前節(jié)點(diǎn)的next值
       }
       x.item = null;//置空當(dāng)前節(jié)點(diǎn)值
       size--;//數(shù)量減一
       modCount++;//操作次數(shù)自增
       return element;//返回刪除節(jié)點(diǎn)值
   }

(4)get方法:

 public E get(int index) {
    checkElementIndex(index);//是否在正常范圍內(nèi),index>=0&&index<size
     return node(index).item;//返回指定索引節(jié)點(diǎn)值
 }
 //根據(jù)索引值返回節(jié)點(diǎn),根據(jù)二分法(折半)查找
 Node<E> node(int index) {
     if (index < (size >> 1)) {//前半部分查找
         Node<E> x = first;//首節(jié)點(diǎn)
         for (int i = 0; i < index; i++)
             x = x.next;//獲得指定索引節(jié)點(diǎn)
         return x;//返回節(jié)點(diǎn)
     } else {
         Node<E> x = last;//尾節(jié)點(diǎn)
         for (int i = size - 1; i > index; i--)
             x = x.prev;//從后往前查找,找到指定索引節(jié)點(diǎn)
         return x;//返回節(jié)點(diǎn)
     }
 }

(5)set方法:

 //指定索引位置進(jìn)行設(shè)值
  public E set(int index, E element) {
      checkElementIndex(index);//檢查索引是否合法
      Node<E> x = node(index);//獲取索引節(jié)點(diǎn)
      E oldVal = x.item;//原索引節(jié)點(diǎn)值
      x.item = element;//設(shè)值
      return oldVal;//返回舊值
  }

3、總結(jié)

(1)LinkedList是線程不安全,多線程環(huán)境會造成并發(fā)修改異常java.util.ConcurrentModificationException;

(2)LinkedList是一個(gè)雙向鏈表結(jié)構(gòu)(無擴(kuò)容機(jī)制),內(nèi)部是Node,外部是首尾節(jié)點(diǎn)first、last。

到此這篇關(guān)于Java的List集合框架之LinkedList詳細(xì)解析的文章就介紹到這了,更多相關(guān)List集合框架之LinkedList內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證

    Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證

    本文向向大家仔細(xì)的介紹了如何使用Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證,有此需求的朋友可以參考下本文
    2021-06-06
  • SpringBoot利用注解來實(shí)現(xiàn)Redis分布式鎖

    SpringBoot利用注解來實(shí)現(xiàn)Redis分布式鎖

    有些業(yè)務(wù)請求,屬于耗時(shí)操作,需要加鎖,防止后續(xù)的并發(fā)操作,同時(shí)對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行操作,需要避免對之前的業(yè)務(wù)造成影響。本文將利用注解來實(shí)現(xiàn)Redis分布式鎖,需要的可以參考一下
    2022-09-09
  • 解決idea不顯示Services工具欄的問題

    解決idea不顯示Services工具欄的問題

    這篇文章主要介紹了解決idea不顯示Services工具欄的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java基礎(chǔ)知識 super和this使用解析

    java基礎(chǔ)知識 super和this使用解析

    這篇文章主要介紹了java基礎(chǔ)知識 super和this使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    這篇文章主要介紹了Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下
    2020-02-02
  • Hibernate悲觀鎖和樂觀鎖實(shí)例詳解

    Hibernate悲觀鎖和樂觀鎖實(shí)例詳解

    這篇文章主要介紹了Hibernate悲觀鎖和樂觀鎖實(shí)例詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java字節(jié)流、字符流與轉(zhuǎn)換流過程

    java字節(jié)流、字符流與轉(zhuǎn)換流過程

    輸入輸出流(IO流)是數(shù)據(jù)傳輸?shù)某橄蟾拍?用于表示數(shù)據(jù)在設(shè)備間的傳輸過程,IO流按數(shù)據(jù)類型分為字符流和字節(jié)流,按數(shù)據(jù)流向分為輸入流和輸出流,字節(jié)流操作單個(gè)字節(jié),字符流操作字符,在實(shí)際應(yīng)用中,非文本文件多用字節(jié)流操作
    2024-10-10
  • Spring IOC 能降低耦合的問題分析及解決方法

    Spring IOC 能降低耦合的問題分析及解決方法

    這篇文章主要介紹了Spring IOC 為什么能降低耦合,依賴注入是調(diào)用者僅通過聲明某個(gè)組件就可以獲得組件的控制權(quán),而對該組件的依賴關(guān)系管理、查找、加載由外部完成,需要的朋友可以參考下
    2022-06-06
  • Java微服務(wù)開發(fā)之Swagger詳解

    Java微服務(wù)開發(fā)之Swagger詳解

    Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)。總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2021-10-10

最新評論