国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

源碼分析——LinkedList源碼分析

這篇具有很好參考價(jià)值的文章主要介紹了源碼分析——LinkedList源碼分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.LinkedList簡(jiǎn)介

LinkedList是一個(gè)實(shí)現(xiàn)了List接口Deque接口雙端鏈表。
LinkedList底層的鏈表結(jié)構(gòu)使它支持高效的插入和刪除操作,另外它實(shí)現(xiàn)了Deque接口,使得LinkedList類也具有隊(duì)列的特性;
LinkedList不是線程安全的,如果想使LinkedList變成線程安全的,可以調(diào)用靜態(tài)類Collections類中的synchronizedList方法:

List list=Collections.synchronizedList(new LinkedList(...));

2.內(nèi)部結(jié)構(gòu)分析

如下圖所示:
源碼分析——LinkedList源碼分析,java筆記整理,java
看完了圖之后,我們?cè)倏碙inkedList類中的一個(gè)內(nèi)部私有類Node就很好理解了:

private static class Node<E> {
        E item;//節(jié)點(diǎn)值
        Node<E> next;//后繼節(jié)點(diǎn)
        Node<E> prev;//前驅(qū)節(jié)點(diǎn)

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

這個(gè)類就代表雙端鏈表的節(jié)點(diǎn)Node。這個(gè)類有三個(gè)屬性,分別是前驅(qū)節(jié)點(diǎn),本節(jié)點(diǎn)的值,后繼結(jié)點(diǎn)。

3.LinkedList源碼分析

3.1構(gòu)造方法

空構(gòu)造方法:

 public LinkedList() {
    }

用已有的集合創(chuàng)建鏈表的構(gòu)造方法:

 public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

3.2add方法

add(E e) 方法:將元素添加到鏈表尾部

public boolean add(E e) {
        linkLast(e);//這里就只調(diào)用了這一個(gè)方法
        return true;
    }
 /**
     * 鏈接使e作為最后一個(gè)元素。
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;//新建節(jié)點(diǎn)
        if (l == null)
            first = newNode;
        else
            l.next = newNode;//指向后繼元素也就是指向下一個(gè)元素
        size++;
        modCount++;
    }

add(int index,E e):在指定位置添加元素

public void add(int index, E element) {
        checkPositionIndex(index); //檢查索引是否處于[0-size]之間

        if (index == size)//添加在鏈表尾部
            linkLast(element);
        else//添加在鏈表中間
            linkBefore(element, node(index));
    }

linkBefore方法需要給定兩個(gè)參數(shù),一個(gè)插入節(jié)點(diǎn)的值,一個(gè)指定的node,所以我們又調(diào)用了Node(index)去找到index對(duì)應(yīng)的node

addAll(Collection c ):將集合插入到鏈表尾部

public boolean addAll(Collection<? extends E> c) {
        return addAll(size, c);
    }

addAll(int index, Collection c): 將集合從指定位置開始插入

public boolean addAll(int index, Collection<? extends E> c) {
        //1:檢查index范圍是否在size之內(nèi)
        checkPositionIndex(index);

        //2:toArray()方法把集合的數(shù)據(jù)存到對(duì)象數(shù)組中
        Object[] a = c.toArray();
        int numNew = a.length;
        if (numNew == 0)
            return false;

        //3:得到插入位置的前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)
        Node<E> pred, succ;
        //如果插入位置為尾部,前驅(qū)節(jié)點(diǎn)為last,后繼節(jié)點(diǎn)為null
        if (index == size) {
            succ = null;
            pred = last;
        }
        //否則,調(diào)用node()方法得到后繼節(jié)點(diǎn),再得到前驅(qū)節(jié)點(diǎn)
        else {
            succ = node(index);
            pred = succ.prev;
        }

        // 4:遍歷數(shù)據(jù)將數(shù)據(jù)插入
        for (Object o : a) {
            @SuppressWarnings("unchecked") E e = (E) o;
            //創(chuàng)建新節(jié)點(diǎn)
            Node<E> newNode = new Node<>(pred, e, null);
            //如果插入位置在鏈表頭部
            if (pred == null)
                first = newNode;
            else
                pred.next = newNode;
            pred = newNode;
        }

        //如果插入位置在尾部,重置last節(jié)點(diǎn)
        if (succ == null) {
            last = pred;
        }
        //否則,將插入的鏈表與先前鏈表連接起來(lái)
        else {
            pred.next = succ;
            succ.prev = pred;
        }

        size += numNew;
        modCount++;
        return true;
    }    

上面可以看出addAll方法通常包括下面四個(gè)步驟:

  1. 檢查index范圍是否在size之內(nèi)
  2. toArray()方法把集合的數(shù)據(jù)存到對(duì)象數(shù)組中
  3. 得到插入位置的前驅(qū)和后繼節(jié)點(diǎn)
  4. 遍歷數(shù)據(jù),將數(shù)據(jù)插入到指定位置

addFirst(E e): 將元素添加到鏈表頭部

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);//新建節(jié)點(diǎn),以頭節(jié)點(diǎn)為后繼節(jié)點(diǎn)
        first = newNode;
        //如果鏈表為空,last節(jié)點(diǎn)也指向該節(jié)點(diǎn)
        if (f == null)
            last = newNode;
        //否則,將頭節(jié)點(diǎn)的前驅(qū)指針指向新節(jié)點(diǎn),也就是指向前一個(gè)元素
        else
            f.prev = newNode;
        size++;
        modCount++;
    }

addLast(E e): 將元素添加到鏈表尾部,與 add(E e) 方法一樣

public void addLast(E e) {
        linkLast(e);
    }

3.3根據(jù)位置取數(shù)據(jù)的方法

get(int index): 根據(jù)指定索引返回?cái)?shù)據(jù)

public E get(int index) {
        //檢查index范圍是否在size之內(nèi)
        checkElementIndex(index);
        //調(diào)用Node(index)去找到index對(duì)應(yīng)的node然后返回它的值
        return node(index).item;
    }

獲取頭節(jié)點(diǎn)(index=0)數(shù)據(jù)方法:

public E getFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return f.item;
    }
public E element() {
        return getFirst();
    }
public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }

public E peekFirst() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
     }

區(qū)別:
getFirst(),element(),peek(),peekFirst()
這四個(gè)獲取頭結(jié)點(diǎn)方法的區(qū)別在于對(duì)鏈表為空時(shí)的處理,是拋出異常還是返回null,其中getFirst()element() 方法將會(huì)在鏈表為空時(shí),拋出異常

element()方法的內(nèi)部就是使用getFirst()實(shí)現(xiàn)的。它們會(huì)在鏈表為空時(shí),拋出NoSuchElementException
獲取尾節(jié)點(diǎn)(index=-1)數(shù)據(jù)方法:

public E getLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return l.item;
    }
 public E peekLast() {
        final Node<E> l = last;
        return (l == null) ? null : l.item;
    }

兩者區(qū)別:
getLast() 方法在鏈表為空時(shí),會(huì)拋出NoSuchElementException,而peekLast() 則不會(huì),只是會(huì)返回 null

3.4根據(jù)對(duì)象得到索引的方法

int indexOf(Object o): 從頭遍歷找

public int indexOf(Object o) {
        int index = 0;
        if (o == null) {
            //從頭遍歷
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null)
                    return index;
                index++;
            }
        } else {
            //從頭遍歷
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item))
                    return index;
                index++;
            }
        }
        return -1;
    }

int lastIndexOf(Object o): 從尾遍歷找

public int lastIndexOf(Object o) {
        int index = size;
        if (o == null) {
            //從尾遍歷
            for (Node<E> x = last; x != null; x = x.prev) {
                index--;
                if (x.item == null)
                    return index;
            }
        } else {
            //從尾遍歷
            for (Node<E> x = last; x != null; x = x.prev) {
                index--;
                if (o.equals(x.item))
                    return index;
            }
        }
        return -1;
    }

3.5檢查鏈表是否包含某對(duì)象的方法:

contains(Object o): 檢查對(duì)象o是否存在于鏈表中

public boolean contains(Object o) {
        return indexOf(o) != -1;
    }
### <font face="楷體" id="3.6">刪除方法</font>

**remove()** ,**removeFirst(),pop():** 刪除頭節(jié)點(diǎn)

```java
public E pop() {
        return removeFirst();
    }
public E remove() {
        return removeFirst();
    }
public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }
**removeLast(),pollLast():** 刪除尾節(jié)點(diǎn)

```java
public E removeLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return unlinkLast(l);
    }
public E pollLast() {
        final Node<E> l = last;
        return (l == null) ? null : unlinkLast(l);
    }

區(qū)別: removeLast()在鏈表為空時(shí)將拋出NoSuchElementException,而pollLast()方法返回null。

remove(Object o): 刪除指定元素

public boolean remove(Object o) {
        //如果刪除對(duì)象為null
        if (o == null) {
            //從頭開始遍歷
            for (Node<E> x = first; x != null; x = x.next) {
                //找到元素
                if (x.item == null) {
                   //從鏈表中移除找到的元素
                    unlink(x);
                    return true;
                }
            }
        } else {
            //從頭開始遍歷
            for (Node<E> x = first; x != null; x = x.next) {
                //找到元素
                if (o.equals(x.item)) {
                    //從鏈表中移除找到的元素
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }

當(dāng)刪除指定對(duì)象時(shí),只需調(diào)用remove(Object o)即可,不過(guò)該方法一次只會(huì)刪除一個(gè)匹配的對(duì)象,如果刪除了匹配對(duì)象,返回true,否則false。

unlink(Node x) 方法:

E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;//得到后繼節(jié)點(diǎn)
        final Node<E> prev = x.prev;//得到前驅(qū)節(jié)點(diǎn)

        //刪除前驅(qū)指針
        if (prev == null) {
            first = next;//如果刪除的節(jié)點(diǎn)是頭節(jié)點(diǎn),令頭節(jié)點(diǎn)指向該節(jié)點(diǎn)的后繼節(jié)點(diǎn)
        } else {
            prev.next = next;//將前驅(qū)節(jié)點(diǎn)的后繼節(jié)點(diǎn)指向后繼節(jié)點(diǎn)
            x.prev = null;
        }

        //刪除后繼指針
        if (next == null) {
            last = prev;//如果刪除的節(jié)點(diǎn)是尾節(jié)點(diǎn),令尾節(jié)點(diǎn)指向該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

remove(int index):刪除指定位置的元素

public E remove(int index) {
        //檢查index范圍
        checkElementIndex(index);
        //將節(jié)點(diǎn)刪除
        return unlink(node(index));
    }

LinkedList類常用方法測(cè)試文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632653.html

package list;

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] srgs) {
        //創(chuàng)建存放int類型的linkedList
        LinkedList<Integer> linkedList = new LinkedList<>();
        /************************** linkedList的基本操作 ************************/
        linkedList.addFirst(0); // 添加元素到列表開頭
        linkedList.add(1); // 在列表結(jié)尾添加元素
        linkedList.add(2, 2); // 在指定位置添加元素
        linkedList.addLast(3); // 添加元素到列表結(jié)尾
        
        System.out.println("LinkedList(直接輸出的): " + linkedList);

        System.out.println("getFirst()獲得第一個(gè)元素: " + linkedList.getFirst()); // 返回此列表的第一個(gè)元素
        System.out.println("getLast()獲得第最后一個(gè)元素: " + linkedList.getLast()); // 返回此列表的最后一個(gè)元素
        System.out.println("removeFirst()刪除第一個(gè)元素并返回: " + linkedList.removeFirst()); // 移除并返回此列表的第一個(gè)元素
        System.out.println("removeLast()刪除最后一個(gè)元素并返回: " + linkedList.removeLast()); // 移除并返回此列表的最后一個(gè)元素
        System.out.println("After remove:" + linkedList);
        System.out.println("contains()方法判斷列表是否包含1這個(gè)元素:" + linkedList.contains(1)); // 判斷此列表包含指定元素,如果是,則返回true
        System.out.println("該linkedList的大小 : " + linkedList.size()); // 返回此列表的元素個(gè)數(shù)

        /************************** 位置訪問(wèn)操作 ************************/
        System.out.println("-----------------------------------------");
        linkedList.set(1, 3); // 將此列表中指定位置的元素替換為指定的元素
        System.out.println("After set(1, 3):" + linkedList);
        System.out.println("get(1)獲得指定位置(這里為1)的元素: " + linkedList.get(1)); // 返回此列表中指定位置處的元素

        /************************** Search操作 ************************/
        System.out.println("-----------------------------------------");
        linkedList.add(3);
        System.out.println("indexOf(3): " + linkedList.indexOf(3)); // 返回此列表中首次出現(xiàn)的指定元素的索引
        System.out.println("lastIndexOf(3): " + linkedList.lastIndexOf(3));// 返回此列表中最后出現(xiàn)的指定元素的索引

        /************************** Queue操作 ************************/
        System.out.println("-----------------------------------------");
        System.out.println("peek(): " + linkedList.peek()); // 獲取但不移除此列表的頭
        System.out.println("element(): " + linkedList.element()); // 獲取但不移除此列表的頭
        linkedList.poll(); // 獲取并移除此列表的頭
        System.out.println("After poll():" + linkedList);
        linkedList.remove();
        System.out.println("After remove():" + linkedList); // 獲取并移除此列表的頭
        linkedList.offer(4);
        System.out.println("After offer(4):" + linkedList); // 將指定元素添加到此列表的末尾

        /************************** Deque操作 ************************/
        System.out.println("-----------------------------------------");
        linkedList.offerFirst(2); // 在此列表的開頭插入指定的元素
        System.out.println("After offerFirst(2):" + linkedList);
        linkedList.offerLast(5); // 在此列表末尾插入指定的元素
        System.out.println("After offerLast(5):" + linkedList);
        System.out.println("peekFirst(): " + linkedList.peekFirst()); // 獲取但不移除此列表的第一個(gè)元素
        System.out.println("peekLast(): " + linkedList.peekLast()); // 獲取但不移除此列表的第一個(gè)元素
        linkedList.pollFirst(); // 獲取并移除此列表的第一個(gè)元素
        System.out.println("After pollFirst():" + linkedList);
        linkedList.pollLast(); // 獲取并移除此列表的最后一個(gè)元素
        System.out.println("After pollLast():" + linkedList);
        linkedList.push(2); // 將元素推入此列表所表示的堆棧(插入到列表的頭)
        System.out.println("After push(2):" + linkedList);
        linkedList.pop(); // 從此列表所表示的堆棧處彈出一個(gè)元素(獲取并移除列表第一個(gè)元素)
        System.out.println("After pop():" + linkedList);
        linkedList.add(3);
        linkedList.removeFirstOccurrence(3); // 從此列表中移除第一次出現(xiàn)的指定元素(從頭部到尾部遍歷列表)
        System.out.println("After removeFirstOccurrence(3):" + linkedList);
        linkedList.removeLastOccurrence(3); // 從此列表中移除最后一次出現(xiàn)的指定元素(從尾部到頭部遍歷列表)
        System.out.println("After removeFirstOccurrence(3):" + linkedList);

        /************************** 遍歷操作 ************************/
        System.out.println("-----------------------------------------");
        linkedList.clear();
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }
        // 迭代器遍歷
        long start = System.currentTimeMillis();
        Iterator<Integer> iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            iterator.next();
        }
        long end = System.currentTimeMillis();
        System.out.println("Iterator:" + (end - start) + " ms");

        // 順序遍歷(隨機(jī)遍歷)
        start = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            linkedList.get(i);
        }
        end = System.currentTimeMillis();
        System.out.println("for:" + (end - start) + " ms");

        // 另一種for循環(huán)遍歷
        start = System.currentTimeMillis();
        for (Integer i : linkedList)
            ;
        end = System.currentTimeMillis();
        System.out.println("for2:" + (end - start) + " ms");

        // 通過(guò)pollFirst()或pollLast()來(lái)遍歷LinkedList
        LinkedList<Integer> temp1 = new LinkedList<>();
        temp1.addAll(linkedList);
        start = System.currentTimeMillis();
        while (temp1.size() != 0) {
            temp1.pollFirst();
        }
        end = System.currentTimeMillis();
        System.out.println("pollFirst()或pollLast():" + (end - start) + " ms");

        // 通過(guò)removeFirst()或removeLast()來(lái)遍歷LinkedList
        LinkedList<Integer> temp2 = new LinkedList<>();
        temp2.addAll(linkedList);
        start = System.currentTimeMillis();
        while (temp2.size() != 0) {
            temp2.removeFirst();
        }
        end = System.currentTimeMillis();
        System.out.println("removeFirst()或removeLast():" + (end - start) + " ms");
    }
}

到了這里,關(guān)于源碼分析——LinkedList源碼分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JAVA學(xué)習(xí)筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    【JAVA學(xué)習(xí)筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/collection_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/list_ 目錄 項(xiàng)目代碼 集合 一、引入 數(shù)組 集合 二、集合的框架體系 單列集合? ? ? ? 雙列集合? ? ? ? Collection類 一、Collection類接

    2024年02月06日
    瀏覽(31)
  • Java進(jìn)階(7)——手動(dòng)實(shí)現(xiàn)LinkedList & 內(nèi)部node類的實(shí)現(xiàn) & 增刪改查的實(shí)現(xiàn) & toString方法 & 源碼的初步理解

    Java進(jìn)階(7)——手動(dòng)實(shí)現(xiàn)LinkedList & 內(nèi)部node類的實(shí)現(xiàn) & 增刪改查的實(shí)現(xiàn) & toString方法 & 源碼的初步理解

    1.linkedList的節(jié)點(diǎn),當(dāng)前,上一個(gè),下一個(gè)的思想; 2.根據(jù)index找node的方法,根據(jù)index確定從頭部還是尾部; 3.linkedlist的增刪改查的實(shí)現(xiàn),本質(zhì)是改變節(jié)點(diǎn)的信息; 4.遞歸方法實(shí)現(xiàn)自定義鏈表的toString方法; Java進(jìn)階(3)——手動(dòng)實(shí)現(xiàn)ArrayList 源碼的初步理解分析 數(shù)組插入數(shù)據(jù)和

    2024年02月11日
    瀏覽(28)
  • 初學(xué)Verilog語(yǔ)言基礎(chǔ)筆記整理(實(shí)例點(diǎn)燈代碼分析)持續(xù)更新~

    初學(xué)Verilog語(yǔ)言基礎(chǔ)筆記整理(實(shí)例點(diǎn)燈代碼分析)持續(xù)更新~

    實(shí)例:點(diǎn)燈學(xué)習(xí) 剛接觸 Verilog ,作為一個(gè)硬件小白,只能嘗試著去理解,文章未完…持續(xù)更新。 參考博客文章: Verilog語(yǔ)言入門學(xué)習(xí)(1) Verilog語(yǔ)法 【 Verilog 】一文帶你了解 Verilog 基礎(chǔ)語(yǔ)法 - 子墨祭的文章 - 知乎 關(guān)于Verilog中的幾種賦值語(yǔ)句 這里抄點(diǎn),那里扣點(diǎn),整理了一

    2024年02月07日
    瀏覽(27)
  • LinkedList & ArrayDeque源碼閱讀

    LinkedList & ArrayDeque源碼閱讀

    本人的源碼閱讀主要聚焦于類的使用場(chǎng)景,一般只在java層面進(jìn)行分析,沒(méi)有深入到一些native方法的實(shí)現(xiàn)。并且由于知識(shí)儲(chǔ)備不完整,很可能出現(xiàn)疏漏甚至是謬誤,歡迎指出共同學(xué)習(xí) 本文基于corretto-17.0.9源碼,參考本文時(shí)請(qǐng)打開相應(yīng)的源碼對(duì)照,否則你會(huì)不知道我在說(shuō)什么 從

    2024年01月16日
    瀏覽(30)
  • Java核心知識(shí)點(diǎn)整理大全23-筆記

    Java核心知識(shí)點(diǎn)整理大全23-筆記

    目錄 21. JAVA 算法 21.1.1. 二分查找 21.1.2.冒泡排序算法 21.1.3. 插入排序算法 21.1.4. 快速排序算法 21.1.1. 希爾排序算法 21.1.2. 歸并排序算法 21.1.3. 桶排序算法 21.1.4. 基數(shù)排序算法 21.1.5. 剪枝算法 21.1.6. 回溯算法 21.1.7. 最短路徑算法 21.1.8. 最大子數(shù)組算法 21.1.9. 最長(zhǎng)公共子序算法

    2024年02月04日
    瀏覽(54)
  • Flutter源碼分析筆記:Widget類源碼分析

    Flutter源碼分析筆記:Widget類源碼分析

    Flutter源碼分析筆記 Widget類源碼分析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.net Email: 291148484@163.com. Shenzhen China Address of this article: https://blog.csdn.net/qq_28550263/article/details/132259681 【介紹】:本文記錄閱讀與分析Flutter源碼 - Widget類源碼分析。 Widget類是Flu

    2024年02月12日
    瀏覽(26)
  • Java修仙之路,十萬(wàn)字吐血整理全網(wǎng)最完整Java學(xué)習(xí)筆記(基礎(chǔ)篇)

    Java修仙之路,十萬(wàn)字吐血整理全網(wǎng)最完整Java學(xué)習(xí)筆記(基礎(chǔ)篇)

    導(dǎo)航: 【Java筆記+踩坑匯總】Java基礎(chǔ)+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外賣/黑馬旅游/谷粒商城/學(xué)成在線+設(shè)計(jì)模式+面試題匯總+性能調(diào)優(yōu)/架構(gòu)設(shè)計(jì)+源碼-CSDN博客 推薦視頻: 黑馬程序員全套Java教程_嗶哩嗶哩 尚硅谷Java入門視頻教程_嗶哩嗶哩 推薦書籍: 《Java編程思想 (第4版

    2024年01月24日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    ?? 單鏈表的節(jié)點(diǎn)中只有一個(gè) next 指針引用著下一個(gè)節(jié)點(diǎn)的地址 ?? 當(dāng)要獲取單鏈表中的最后一個(gè)元素的時(shí)候,需要從頭節(jié)點(diǎn)開始遍歷到最后 ?? 單鏈表一開始的時(shí)候有 first 頭指針引用著頭節(jié)點(diǎn)的地址 ?? 雙向鏈表可以提升鏈表的綜合性能 ?? 雙向鏈表的節(jié)點(diǎn)中有 prev 指針引

    2024年02月12日
    瀏覽(22)
  • SpringCloud源碼學(xué)習(xí)筆記3——Nacos服務(wù)注冊(cè)源碼分析

    SpringCloud源碼學(xué)習(xí)筆記3——Nacos服務(wù)注冊(cè)源碼分析

    系列文章目錄和關(guān)于我 實(shí)現(xiàn)服務(wù)治理、服務(wù)動(dòng)態(tài)擴(kuò)容,以及調(diào)用時(shí)能有負(fù)載均衡的效果。 如果我們將服務(wù)提供方的ip地址配置在服務(wù)消費(fèi)方的配置文件中,當(dāng)服務(wù)提供方實(shí)例上線下線,消費(fèi)方都需要重啟服務(wù),導(dǎo)致二者耦合度過(guò)高。注冊(cè)中心就是在二者之間加一層,實(shí)現(xiàn)解耦

    2023年04月08日
    瀏覽(28)
  • 【Java】LinkedList 集合

    【Java】LinkedList 集合

    LinkedList集合特點(diǎn) LinkedList 底層基于雙向鏈表實(shí)現(xiàn)增刪 效率非常高,查詢效率非常低。 LinkedList源碼解讀分析 LinkedList 是雙向鏈表實(shí)現(xiàn)的 List LinkedList 是非線程安全的(線程是不安全的) LinkedList 元素允許為null,允許重復(fù)元素 LinkedList 是基于鏈表是實(shí)現(xiàn)的,因此插入刪除效率高

    2024年02月07日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包