成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

LinkedList源碼

jonh_felix / 2190人閱讀

摘要:不是線程安全確保線程安全方法源碼分析靜態(tài)內(nèi)部類(lèi)是一個(gè)鏈表需要一個(gè)類(lèi)作為節(jié)點(diǎn),因此他在內(nèi)部構(gòu)建了一個(gè)靜態(tài)內(nèi)部類(lèi)。靜態(tài)內(nèi)部類(lèi),該類(lèi)不能直接訪問(wèn)的非靜態(tài)成員屬性和方法,因?yàn)榈募s束靜態(tài)方法不能直接訪問(wèn)非靜態(tài)的成員。通過(guò)方法取得對(duì)象,然后取得的值。

1 說(shuō)明

LinkedList是一個(gè)雙向鏈表,繼承看List接口和Duque接口。

LinkedList不是線程安全,確保線程安全方法

 List list = Collections.synchronizedList(new LinkedList(...))
2 源碼分析 2.1 靜態(tài)內(nèi)部類(lèi)

LinkedList是一個(gè)鏈表,需要一個(gè)node類(lèi)作為節(jié)點(diǎn),因此他在內(nèi)部構(gòu)建了一個(gè)靜態(tài)內(nèi)部類(lèi)。

private static class Node {
    E item;
    Node next;
    Node prev;

    Node(Node prev, E element, Node next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

靜態(tài)內(nèi)部類(lèi),該類(lèi)不能直接訪問(wèn)LinkedLIst的非靜態(tài)成員(屬性和方法),因?yàn)镴ava的約束:靜態(tài)方法不能直接訪問(wèn)非靜態(tài)的成員。

2.2 add()方法

往==鏈表尾部==添加元素,boolean修飾,總是返回true

public boolean add(E e) {
    linkLast(e);
    return true;
}

再看linkLast(e)方法

void linkLast(E e) {
    final Node l = last;
    final Node newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

如果l為空,則表示鏈表為空,插入的元素作為列表的第一個(gè)元素。
last是一個(gè)全局變量

transient Node last;

然后相應(yīng)的size也增加。size也是一個(gè)全局變量

transient int size = 0;

這樣的話就可以寫(xiě)個(gè)獲取size的方法,所以的size的方法為

public int size() {
    return size;
}
2.3 get()方法
public E get(int index) {
    checkElementIndex(index); 
    return node(index).item;
}

==checkElementIndex(index)== 判斷尋找的索引是否越界,如果越界則拋出異常。
==node(index).item== 通過(guò)方法取得nod對(duì)象,然后取得item的值。

Node node(int index) {
    // assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}

這里通過(guò)位運(yùn)算找出尋找范圍的中間值,如果小于中間值,則出鏈頭開(kāi)始尋找,否則從鏈尾往回尋找。值得借鑒。

2.4 toArray()方法

將列表轉(zhuǎn)成數(shù)組的一個(gè)橋梁方法

public Object[] toArray() {
    Object[] result = new Object[size];
    int i = 0;
    for (Node x = first; x != null; x = x.next)
        result[i++] = x.item;
    return result;
}
2.5 clear()方法

此調(diào)用返回后,列表將為空

public void clear() {
    // Clearing all of the links between nodes is "unnecessary", but:
    // - helps a generational GC if the discarded nodes inhabit
    //   more than one generation
    // - is sure to free memory even if there is a reachable Iterator
    for (Node x = first; x != null; ) {
        Node next = x.next;
        x.item = null;
        x.next = null;
        x.prev = null;
        x = next;
    }
    first = last = null;
    size = 0;
    modCount++;
}

可以利用該方法清空l(shuí)ist列表,達(dá)到list多次復(fù)用的目的,減少內(nèi)存花銷(xiāo)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77751.html

相關(guān)文章

  • 集合框架源碼學(xué)習(xí)之LinkedList

    摘要:它們會(huì)在鏈表為空時(shí),拋出獲取尾節(jié)點(diǎn)數(shù)據(jù)方法兩者區(qū)別方法在鏈表為空時(shí),會(huì)拋出,而則不會(huì),只是會(huì)返回。 目錄: 0-1. 簡(jiǎn)介 0-2. 內(nèi)部結(jié)構(gòu)分析 0-3. LinkedList源碼分析   0-3-1. 構(gòu)造方法   0-3-2. 添加add方法     0-3-3. 根據(jù)位置取數(shù)據(jù)的方法   0-3-4. 根據(jù)對(duì)象得到索引的方法   0-3-5. 檢查鏈表是否包含某對(duì)象的方法  ...

    kumfo 評(píng)論0 收藏0
  • LinkedList源碼分析:JDK源碼分析系列

    摘要:介紹是線程不安全的,允許元素為的雙向鏈表。構(gòu)造方法共有兩個(gè)構(gòu)造方法,一個(gè)是創(chuàng)建一個(gè)空的構(gòu)造函數(shù),一個(gè)是將已有的添加到中。是將元素插入到的頭部。下一篇文章繼續(xù)分析上次分析了的結(jié)構(gòu)和添加方法這次開(kāi)始分析下面的。注意源碼版本為直接進(jìn)入正題。 如果本文中有不正確的地方請(qǐng)指出由于沒(méi)有留言可以在公眾號(hào)添加我的好友共同討論。 1.介紹 LinkedList 是線程不安全的,允許元素為null的雙向鏈...

    blair 評(píng)論0 收藏0
  • LinkedList源碼和并發(fā)問(wèn)題分析

    摘要:在次操作中其實(shí)即尾節(jié)點(diǎn)是共享資源,當(dāng)多個(gè)線程同時(shí)執(zhí)行此方法的時(shí)候,其實(shí)會(huì)出現(xiàn)線程安全問(wèn)題。同樣會(huì)出現(xiàn)并發(fā)安全問(wèn)題,下面對(duì)此問(wèn)題進(jìn)行分析。 1.LinkedList源碼分析 LinkedList的是基于鏈表實(shí)現(xiàn)的java集合類(lèi),通過(guò)index插入到指定位置的時(shí)候使用LinkedList效率要比ArrayList高,以下源碼分析是基于JDK1.8. 1.1 類(lèi)的繼承結(jié)構(gòu) LinkedLis...

    xietao3 評(píng)論0 收藏0
  • LinkedList源碼解析

    摘要:我們來(lái)看相關(guān)源碼我們看到封裝的和操作其實(shí)就是對(duì)頭結(jié)點(diǎn)的操作。迭代器通過(guò)指針,能指向下一個(gè)節(jié)點(diǎn),無(wú)需做額外的遍歷,速度非??臁2煌谋闅v性能差距極大,推薦使用迭代器進(jìn)行遍歷。LinkedList類(lèi)介紹 上一篇文章我們介紹了JDK中ArrayList的實(shí)現(xiàn),ArrayList底層結(jié)構(gòu)是一個(gè)Object[]數(shù)組,通過(guò)拷貝,復(fù)制等一系列封裝的操作,將數(shù)組封裝為一個(gè)幾乎是無(wú)限的容器。今天我們來(lái)介紹JD...

    roundstones 評(píng)論0 收藏0
  • 站在巨人肩膀上看源碼-LinkedList

    摘要:在閱讀源碼之前,我們先對(duì)的整體實(shí)現(xiàn)進(jìn)行大致說(shuō)明實(shí)際上是通過(guò)雙向鏈表去實(shí)現(xiàn)的。獲取的最后一個(gè)元素由于是雙向鏈表而表頭不包含數(shù)據(jù)。實(shí)際上是判斷雙向鏈表的當(dāng)前節(jié)點(diǎn)是否達(dá)到開(kāi)頭反向迭代器獲取下一個(gè)元素。 第1部分 LinkedList介紹 LinkedList簡(jiǎn)介 LinkedList 是一個(gè)繼承于AbstractSequentialList的雙向鏈表。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操...

    learn_shifeng 評(píng)論0 收藏0
  • LinkedList源碼分析

    摘要:表明該類(lèi)是可以序列化的。與對(duì)比并沒(méi)有實(shí)現(xiàn),而實(shí)現(xiàn)表明其支持快速通常是固定時(shí)間隨機(jī)訪問(wèn)。此接口的主要目的是允許一般的算法更改其行為,從而在將其應(yīng)用到隨機(jī)或連續(xù)訪問(wèn)列表時(shí)能提供良好的性能。這是隨機(jī)訪問(wèn)效率低的原因之一。指定節(jié)點(diǎn)不能為。 總覽 showImg(https://segmentfault.com/img/bVbsIzr?w=1007&h=600); 定義 public class...

    tommego 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<