最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java 集合系列(三)—— LinkedList

 更新時(shí)間:2019年04月01日 09:49:46   作者:那一葉隨風(fēng)  
這篇文章主要介紹了Java 集合系列(三)—— LinkedList,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

LinkedList

LinkedList是一種可以在任何位置進(jìn)行高效地插入和刪除操作的有序序列。
它的最基本存儲結(jié)構(gòu)是一個(gè)節(jié)點(diǎn):每個(gè)節(jié)點(diǎn)將存儲對象,以及前后節(jié)點(diǎn)的引用。

結(jié)構(gòu)圖

從上面的結(jié)構(gòu)圖中,我們可以了解到 ListedList 底層是基于雙向鏈表實(shí)現(xiàn)的。
圍起來的可以看成 LinkedList 類,它定義了三個(gè) transient 成員變量:first、last、size。這三個(gè)變量是整個(gè) LinkedList 類的關(guān)鍵點(diǎn)。

  1. 由于是雙向鏈表(每個(gè)node都有保存前后節(jié)點(diǎn)的引用),因此我們不管是由 first 還是 last 節(jié)點(diǎn)開始迭代,都可以將整個(gè)鏈表的數(shù)據(jù)找出來;
  2. 在查詢、隨機(jī)插入以及set等操作都有涉及 size 判斷;
  3. 由于 LinkedList 是雙向鏈表,類中只存儲了首尾兩個(gè)節(jié)點(diǎn),因此查詢第n個(gè)元素都要從頭遍歷進(jìn)行查找。

 源碼分析

add(E e)  源碼分析

/**
  * Appends the specified element to the end of this list.
  *
  * <p>This method is equivalent to {@link #addLast}.
  *
  * @param e element to be appended to this list
  * @return {@code true} (as specified by {@link Collection#add})
  */
 public boolean add(E e) {
  linkLast(e);
  return true;
 }
 
 /**
  * Links e as last element.
  */
 void linkLast(E e) {
  final Node<E> l = last;        // 將當(dāng)前最后一個(gè)元素寄存在 l
  final Node<E> newNode = new Node<>(l, e, null);  // new 一個(gè)新節(jié)點(diǎn):pre的引用為l;存儲元素為e;next的引用為null
  last = newNode;          // 將新節(jié)點(diǎn)引用覆蓋成員變量 last
  if (l == null)          
   first = newNode;        // 若l為null,說明之前鏈表為空,此時(shí)新節(jié)點(diǎn)為首個(gè)元素
  else
   l.next = newNode;        // 否則,更新l的next引用
  size++;            // size+1
  modCount++;           // 非查詢操作 modCount 都會 +1
 }

add(int index, E element) 方法分析

/**
  * Inserts the specified element at the specified position in this list.
  * Shifts the element currently at that position (if any) and any
  * subsequent elements to the right (adds one to their indices).
  *
  * @param index index at which the specified element is to be inserted
  * @param element element to be inserted
  * @throws IndexOutOfBoundsException {@inheritDoc}
  */
 public void add(int index, E element) {
  checkPositionIndex(index); // 檢查 index 是否大于 size

  if (index == size)
   linkLast(element);  // 直接在鏈表末尾追加
  else
   linkBefore(element, node(index)); // 插入index 節(jié)點(diǎn)前面
 }
 
 
 // 檢查 index 是否超出范圍 超出則拋出 IndexOutOfBoundsException
 private void checkPositionIndex(int index) {
  if (!isPositionIndex(index))
   throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
 }

 /**
  * Tells if the argument is the index of a valid position for an
  * iterator or an add operation.
  */
 private boolean isPositionIndex(int index) {
  return index >= 0 && index <= size;
 }
 
 
 
 /**
  * 根據(jù) index 查找 node
  * 該方法利用了雙向鏈表的特性,index 距離哪個(gè)鏈表頭近就從哪邊開始開始遍歷
  * 時(shí)間復(fù)雜度為 O(n/2);
  * 當(dāng) index 接近 size 的中間值時(shí),效率最低
  * Returns the (non-null) Node at the specified element index.
  */
 Node<E> node(int index) {
  // assert isElementIndex(index);

  if (index < (size >> 1)) {   // size 右移一位(除以2)
   Node<E> x = first;
   for (int i = 0; i < index; i++)
    x = x.next;
   return x;
  } else {
   Node<E> x = last;
   for (int i = size - 1; i > index; i--)
    x = x.prev;
   return x;
  }
 }

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

增刪元素效率高(只需要更新節(jié)點(diǎn)附近的引用即可)

缺點(diǎn)

由于查詢需要進(jìn)行遍歷,因此效率低

知識腦圖

以上所述是小編給大家介紹的Java 集合系列(三)—— LinkedList詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 利用5分鐘快速搭建一個(gè)springboot項(xiàng)目的全過程

    利用5分鐘快速搭建一個(gè)springboot項(xiàng)目的全過程

    Spring Boot的監(jiān)控能夠使開發(fā)者更好地掌控應(yīng)用程序的運(yùn)行狀態(tài),下面這篇文章主要給大家介紹了關(guān)于如何利用5分鐘快速搭建一個(gè)springboot項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 聊聊Redis二進(jìn)制數(shù)組Bitmap

    聊聊Redis二進(jìn)制數(shù)組Bitmap

    這篇文章主要介紹了Redis二進(jìn)制數(shù)組Bitmap,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java模擬hibernate一級緩存示例分享

    java模擬hibernate一級緩存示例分享

    這篇文章主要介紹了java模擬hibernate一級緩存示例,需要的朋友可以參考下
    2014-03-03
  • Lombok的@Accessors使用說明

    Lombok的@Accessors使用說明

    這篇文章主要介紹了Lombok的@Accessors使用說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java中元素排序Comparable和Comparator的區(qū)別

    java中元素排序Comparable和Comparator的區(qū)別

    本文主要介紹了java中元素排序Comparable和Comparator的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Eclipse中Properties和yml配置文件注釋亂碼的解決

    Eclipse中Properties和yml配置文件注釋亂碼的解決

    這篇文章主要介紹了Eclipse中Properties和yml配置文件注釋亂碼的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Spring的@CrossOrigin注解使用與CrossFilter對象自定義詳解

    Spring的@CrossOrigin注解使用與CrossFilter對象自定義詳解

    這篇文章主要介紹了Spring的@CrossOrigin注解使用與CrossFilter對象自定義詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制,所謂同源是指,域名,協(xié)議,端口均相同,需要的朋友可以參考下
    2023-12-12
  • IDEA2023 配置使用Docker的詳細(xì)教程

    IDEA2023 配置使用Docker的詳細(xì)教程

    這篇文章主要介紹了IDEA2023 配置使用Docker的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解

    Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲在一個(gè)變量中,是為了保證原子性,需要的朋友可以參考下
    2024-01-01
  • servlet Cookie使用方法詳解(六)

    servlet Cookie使用方法詳解(六)

    這篇文章主要為大家詳細(xì)介紹了servlet Cookie的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論

永川市| 齐齐哈尔市| 荔波县| 衡山县| 三江| 沧源| 大安市| 滕州市| 吉木萨尔县| 嵊州市| 桦川县| 丹凤县| 海安县| 穆棱市| 鄄城县| 平湖市| 沿河| 泾源县| 周口市| 岳池县| 新竹市| 阳曲县| 池州市| 龙海市| 阳高县| 津市市| 辽中县| 长治市| 社旗县| 昌邑市| 寻甸| 烟台市| 泸定县| 尉氏县| 赫章县| 界首市| 贵南县| 荣成市| 玉屏| 河曲县| 鄢陵县|