Java鏈表使用解讀
Java鏈表使用
鏈表(Linked List)是一種線性數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)包含兩部分:一部分為用于儲存數(shù)據(jù)元素,另部分是一種引用(指針),指向下一個(gè)節(jié)點(diǎn)。
這種結(jié)構(gòu)允許動態(tài)地添加和刪除元素,而不需要像數(shù)組那種大規(guī)模的數(shù)據(jù)移動。
java鏈表的定義
在java中,鏈表可以通過自定義來實(shí)現(xiàn),也可以直接使用java.util.LinkedList
類。
LinkedList
實(shí)現(xiàn)了接口,并且提供了雙向鏈接的功能,即每個(gè)節(jié)點(diǎn)不僅由指向下一個(gè)節(jié)點(diǎn)的引用,哈有指向前一個(gè)節(jié)點(diǎn)的引用。
這意味著LinkedList
不僅可以作為列表使用,還可以作為棧或隊(duì)列使用,因?yàn)樗腔陔p向鏈表現(xiàn)實(shí)的。
每個(gè)節(jié)點(diǎn)通常包含兩個(gè)字段:
data
:用于存儲實(shí)際的數(shù)據(jù)。next
:用于存儲向下一個(gè)節(jié)點(diǎn)的引用;如果是雙向鏈表,則還有一個(gè)prev
字段用于存儲指向前一個(gè)節(jié)點(diǎn)的引用。
實(shí)例
在自定義單項(xiàng)鏈表是,可以這樣定義節(jié)點(diǎn)類:
class Node<E> { private E elem; // 數(shù)據(jù)域 private Node<E> next; // 指針域 public Node(E element, Node<E> next) { this.elem = element; this.next = next; } // Getter 和 Setter 方法... }
對于LinkedList
類而言,內(nèi)部由一個(gè)靜態(tài)內(nèi)部類Node
,用來表示鏈表中的節(jié)點(diǎn)。此外,LinkedList
還維護(hù)著幾個(gè)重要的成員變量,例如size
(記錄鏈表大?。?、first
(指向第一個(gè)節(jié)點(diǎn))和last
(指向最后一個(gè)節(jié)點(diǎn))。這些變量是的可以在O(1)時(shí)間內(nèi)完成對鏈表頭部或尾部的操作。
Java鏈表的應(yīng)用
由于鏈表具有靈活的內(nèi)存管理和高效的插入\刪除操作特性,因此適用于多種引用場景:
- 頻繁插入和刪除:當(dāng)應(yīng)用程序需要頻繁地在集合中插入或刪除元素是,使用
LinkedList
會比ArrayList
更有效率。這是因?yàn)?code>LinkedList不需要像ArrayList
那樣在插入或刪除時(shí)調(diào)整其他元素的位置,從而避免了額外的時(shí)間開銷。 - 作為?;蜿?duì)列使用:
LinkedList
實(shí)現(xiàn)了Deque
接口,所以它可以很方便地用作棧(通過addFirst()
、removeFirst()
等方法)或者隊(duì)列(通過addList()
、removeFirst()
等方法)。 - 緩存系統(tǒng):某些緩存算法(例如LRU,Least Recentiy Used)可能需要用到
LinkedList
來維護(hù)元素的順序。如,可以結(jié)合HashMap
和LinkedList
實(shí)現(xiàn)一個(gè)簡單的LRu緩存。 - 多線程環(huán)境下的隊(duì)列:盡管
LinkedList
本身不是線程安全的,但在多線程環(huán)境中,可以通過適當(dāng)?shù)耐綑C(jī)制將其用作線程安全的隊(duì)列。 - 文件系統(tǒng)的實(shí)現(xiàn):鏈表的概念也被應(yīng)用與文件系統(tǒng)的設(shè)計(jì)中,比如FAT32、NTFS等格式的選擇實(shí)際上就是在選擇不同類型的鏈表空間規(guī)模及格式。
- 高級數(shù)據(jù)結(jié)構(gòu):除了上述應(yīng)用外,java鏈表還可以用于構(gòu)建更加復(fù)雜的結(jié)構(gòu),如雙端隊(duì)列(Deque)、循環(huán)鏈表(Circular Linked List)、跳表(Skip List)等。
- 鏈表合并:在排序算法中,如歸并排序、合并兩個(gè)有序鏈表也是常見的操作之一。
- 返回倒數(shù)第K個(gè)節(jié)點(diǎn):利用前后指針法可以高效地找到鏈表中的倒數(shù)第K個(gè)節(jié)點(diǎn)。
常用方法
方法 | 描述 |
---|---|
public boolean add(E e) | 鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection c) | 將一個(gè)集合的所有元素添加到鏈表后面,返回是否成功,成功為 true,失敗為 false。 |
public boolean addAll(int index, Collection c) | 將一個(gè)集合的所有元素添加到鏈表的指定位置后面,返回是否成功,成功為 true,失敗為 false。 |
public void addFirst(E e) | 元素添加到頭部。 |
public void addLast(E e) | 元素添加到尾部。 |
方法 | 描述 |
public boolean add(E e) | 鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection c) | 將一個(gè)集合的所有元素添加到鏈表后面,返回是否成功,成功為 true,失敗為 false。 |
public boolean addAll(int index, Collection c) | 將一個(gè)集合的所有元素添加到鏈表的指定位置后面,返回是否成功,成功為 true,失敗為 false。 |
public void addFirst(E e) | 元素添加到頭部。 |
public void addLast(E e) | 元素添加到尾部。 |
public boolean offer(E e) | 向鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerFirst(E e) | 頭部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerLast(E e) | 尾部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public void clear() | 清空鏈表。 |
public E removeFirst() | 刪除并返回第一個(gè)元素。 |
public E removeLast() | 刪除并返回最后一個(gè)元素。 |
public boolean remove(Object o) | 刪除某一元素,返回是否成功,成功為 true,失敗為 false。 |
public E remove(int index) | 刪除指定位置的元素。 |
public E poll() | 刪除并返回第一個(gè)元素。 |
public E remove() | 刪除并返回第一個(gè)元素。 |
public boolean contains(Object o) | 判斷是否含有某一元素 |
public E get(int index) | 返回指定位置的元素。 |
public E getFirst() | 返回第一個(gè)元素。 |
public E getLast() | 返回最后一個(gè)元素。 |
public int indexOf(Object o) | 查找指定元素從前往后第一次出現(xiàn)的索引。 |
public int lastIndexOf(Object o) | 查找指定元素最后一次出現(xiàn)的索引。 |
public E peek() | 返回第一個(gè)元素。 |
public E element() | 返回第一個(gè)元素。 |
public E peekFirst() | 返回頭部元素。 |
public E peekLast() | 返回尾部元素。 |
public E set(int index, E element) | 設(shè)置指定位置的元素。 |
public Object clone() | 克隆該列表。 |
public Iterator descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回鏈表元素個(gè)數(shù)。 |
public ListIterator listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
public Object[] toArray() | 返回一個(gè)由鏈表元素組成的數(shù)組。 |
public T[] toArray(T[] a) | 返回一個(gè)由鏈表元素轉(zhuǎn)換類型而成的數(shù)組。 |
上述列來自于菜鳥教程,下方為更多API方法
LinkedList (Java SE 11 & JDK 11 )
鏈表應(yīng)用定義總結(jié)
Java中的鏈表不僅是一個(gè)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),而且因其靈活性和效率,在許多不同的編程場景中都有著廣泛的應(yīng)用。
無論是作為簡單的容器還是構(gòu)建更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)組件,鏈表都扮演著不可或缺的角色。
鏈表應(yīng)用實(shí)例
創(chuàng)建鏈表
首先,我們可以創(chuàng)建一個(gè)空的LinkedList
實(shí)例:
import java.util.LinkedList; public class LinkedListExample { public static void main(String[] args) { // 創(chuàng)建一個(gè)新的空LinkedList LinkedList<String> list = new LinkedList<>(); } }
這段代碼展示了如何導(dǎo)入java.util.LinkedList
包,并創(chuàng)建了一個(gè)存儲字符串類型的LinkedList
對象。
添加元素
接下來,我們可以在鏈表中添加元素。可以使用add()
方法向鏈表末尾添加元素,或者使用addFirst()
、addLast()
分別向鏈表頭部或尾部插入元素。
// 向鏈表末尾添加元素 list.add("Apple"); list.add("Banana"); // 向鏈表頭部添加元素 list.addFirst("Orange"); // 向鏈表尾部添加元素 list.addLast("Grape");
這里展示了如何使用不同的方法向鏈表中添加元素。值得注意的是,addFirst()
和addLast()
提供了更明確的操作意圖,而不僅僅是默認(rèn)地添加到鏈表末尾。
訪問元素
訪問鏈表中的元素可以通過索引進(jìn)行,也可以遍歷整個(gè)鏈表。對于前者,可以使用get()
方法;對于后者,則可以使用增強(qiáng)型for循環(huán)或迭代器。
// 通過索引訪問元素 String element = list.get(1); // 獲取第二個(gè)元素 // 使用增強(qiáng)型for循環(huán)遍歷鏈表 for (String fruit : list) { System.out.println(fruit); } // 使用迭代器遍歷鏈表 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
這里介紹了兩種常見的遍歷方式:一種是直接通過索引獲取特定位置的元素,另一種則是利用迭代器逐一訪問每個(gè)元素。
刪除元素
刪除鏈表中的元素同樣支持多種方式,包括根據(jù)索引刪除、根據(jù)值刪除以及移除鏈表頭尾的元素。
// 根據(jù)索引刪除元素 list.remove(0); // 移除第一個(gè)元素 // 根據(jù)值刪除元素 list.remove("Banana"); // 移除值為"Banana"的第一個(gè)匹配項(xiàng) // 移除鏈表頭部元素 list.removeFirst(); // 移除鏈表尾部元素 list.removeLast();
插入元素
除了簡單的添加和刪除外,還可以在鏈表的任意位置插入新元素。這通常涉及到先找到目標(biāo)位置,然后將新元素插入到該位置之前或之后。
// 在指定位置插入元素 list.add(1, "Peach"); // 在索引1處插入"Peach"
查找元素
如果想要檢查某個(gè)元素是否存在於鏈表中,可以使用contains()
方法。
boolean exists = list.contains("Apple"); if (exists) { System.out.println("The list contains Apple."); } else { System.out.println("The list does not contain Apple."); }
這段代碼用來驗(yàn)證鏈表中是否包含特定元素,并輸出相應(yīng)的消息。
這些例子涵蓋了Java中LinkedList
的基本用法,包括創(chuàng)建、添加、訪問、刪除、插入以及查找元素。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
老生常談Java中List與ArrayList的區(qū)別
大家都知道List是接口,ArrayList是List接口的一個(gè)實(shí)現(xiàn)類,接下來通過本文給大家介紹Java中List與ArrayList的區(qū)別,需要的朋友可以參考下2022-08-08SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼
作為分布式項(xiàng)目,單點(diǎn)登錄是必不可少的,這篇文章主要介紹了SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01SpringBoot多數(shù)據(jù)源的兩種實(shí)現(xiàn)方式實(shí)例
最近在項(xiàng)目開發(fā)中,需要為一個(gè)使用MySQL數(shù)據(jù)庫的SpringBoot項(xiàng)目,新添加一個(gè)PLSQL數(shù)據(jù)庫數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源的兩種實(shí)現(xiàn)方式,需要的朋友可以參考下2022-04-04ThreadLocal簡介_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了ThreadLocal簡介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Spring6?的JdbcTemplate的JDBC模板類的使用介紹(最新推薦)
JdbcTemplate?是Spring?提供的一個(gè)JDBC模板類,是對JDBC的封裝,簡化JDBC代碼,當(dāng)然,你也可以不用,可以讓Spring集成其它的ORM框架,這篇文章主要介紹了Spring6?的JdbcTemplate的JDBC模板類的詳細(xì)使用說明,需要的朋友可以參考下2024-05-05Servlet關(guān)于RequestDispatcher的原理詳解
這篇文章主要介紹了Servlet關(guān)于RequestDispatcher的原理詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Maven將Jar包打入本地倉庫的實(shí)現(xiàn)
項(xiàng)目需要用到一個(gè)Jar包,不能從遠(yuǎn)程倉庫拉取,只有一個(gè)Jar包,所以需要將Jar包打入到本地倉庫才能引入項(xiàng)目,本文主要介紹了Maven將Jar包打入本地倉庫的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12