Java中的LinkedList(鏈表)(如果想知道Java中有關LinkedList的知識點,那么只看這一篇就足夠了!)

? ? ? ? 前言:在Java編程語言中,Java集合框架提供了一組豐富的數據結構,以滿足各種應用需求。其中,LinkedList作為一種常用的數據結構,具有獨特的優勢和廣泛的應用場景。


???這里是秋刀魚不做夢的BLOG

???想要了解更多內容可以訪問我的主頁秋刀魚不做夢-CSDN博客

先讓我們看一下本文大致的講解內容:

目錄

1.LinkedList的初識

2.LinkedList的創建

3.LinkedList中的常見API

(1)添加元素

(2)刪除元素

(3)修改元素

(4)獲取元素

4.LinkedList的遍歷

(1)使用 for 循環

(2)使用增強型 for 循環

(3)使用 Iterator

(4)使用 ListIterator

(5)直接打印

5.LinkedList與ArrayList的區別


1.LinkedList的初識

? ? ? ? 在開始學習LinkedList之前,讓我們先了解一下什么是LinkedList:

????????LinkedList(雙向鏈表)是一種基于鏈表實現的線性數據結構,與ArrayList(順序表)等基于數組實現的結構不同,它通過節點的引用來管理元素的存儲和連接。

????????其中每個節點包含三個主要部分:數據部分、指向下一個節點的指針(next)和指向前一個節點的指針(prev)。

下圖很好的展示了什么是通過節點的引用來管理元素的存儲和連接以及雙向鏈表的構成:

? ? ? ?——?通過上邊的解釋,我相信讀者你已經對LinkedList(雙向鏈表)有了自己的初步認知,那么接下來我們從LinkedList在整個集合框架中與其他類與接口的關系來繼續介紹LinkedList(雙向鏈表)

LinkedList與其他類與接口的關系:

從上圖中我們可以了解到:

1.? LinkedList實現了List接口;
2.? LinkedList的底層使用了雙向鏈表;
3.? LinkedList沒有實現RandomAccess接口,因此LinkedList不支持隨機訪問;

????????通過上邊的簡單介紹,相信讀者已經大致的了解了Java中的LinkedList,那么接下來讓我們開始正式的來學習Java中的LinkedList(雙向鏈表)吧。

2.LinkedList的創建

? ? ? ? 在Java中創建LinkedList有兩種方式:

方法解釋
LinkedList()無參構造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素構造List

(1)讓我們使用一個案例來看一下使用空參創建LinkedList的方式:

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 創建一個空的LinkedListLinkedList<String> linkedList = new LinkedList<>();// 添加一些元素到LinkedList中linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 輸出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

(2)讓我們使用一個案例來看一下使用使用其他集合容器中元素構造創建LinkedList的方式:

import java.util.LinkedList;
import java.util.ArrayList;public class LinkedListFromCollection {public static void main(String[] args) {// 創建一個ArrayList并添加一些元素ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Element 1");arrayList.add("Element 2");arrayList.add("Element 3");// 使用ArrayList創建一個LinkedListLinkedList<String> linkedList = new LinkedList<>(arrayList);// 輸出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

? ? ? ? ——這樣我們就大致的了解了如何創建LinkedList了。

3.LinkedList中的常見API

? ? ? ? 了解完如何創建一個LinkedList之后,讓我們開始學習如何去操作所創建好的LinkedList。以下我們將會從增刪查改四個方面來解釋有關LinkedList的常用API。

(1)添加元素

  • add(E e): 在鏈表末尾添加元素。

  • add(int index, E element): 在指定位置插入元素。

  • addFirst(E e): 在鏈表頭部添加元素。

  • addLast(E e): 在鏈表尾部添加元素。

接下來讓我們使用案例來幫助你進一步理解:

import java.util.LinkedList;public class LinkedListAddExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();// 在末尾添加元素linkedList.add("Element 1");linkedList.add("Element 2");// 在指定位置插入元素linkedList.add(1, "Inserted Element");// 在頭部添加元素linkedList.addFirst("First Element");// 在尾部添加元素linkedList.addLast("Last Element");//打印結果System.out.println("final: " + linkedList);}
}

(2)刪除元素

  • remove(): 移除并返回鏈表的第一個元素。

  • remove(int index): 移除并返回指定位置的元素。

  • removeFirst(): 移除并返回鏈表的第一個元素。

  • removeLast(): 移除并返回鏈表的最后一個元素。

讓我們使用案例來幫助你進一步理解:

import java.util.LinkedList;public class LinkedListRemoveExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");System.out.println("Initial LinkedList: " + linkedList);// 移除并返回第一個元素String removedElement = linkedList.remove();System.out.println("Removed Element: " + removedElement);// 移除指定位置的元素String removedIndexElement = linkedList.remove(1);System.out.println("Removed Element at Index 1: " + removedIndexElement);// 移除第一個元素linkedList.addFirst("New First Element");String removedFirstElement = linkedList.removeFirst();System.out.println("Removed First Element: " + removedFirstElement);// 移除最后一個元素String removedLastElement = linkedList.removeLast();System.out.println("Removed Last Element: " + removedLastElement);//打印結果System.out.println("final: " + linkedList);}
}

(3)修改元素

  • set(int index , E element): 修改指定索引位置的元素。

讓我們使用案例來幫助你進一步理解:

import java.util.LinkedList;public class LinkedListSetExample {public static void main(String[] args) {// 創建一個LinkedList并添加一些元素LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");linkedList.add("Element 4");// 輸出初始的LinkedListSystem.out.println("Initial LinkedList: " + linkedList);// 使用set方法替換索引為2的元素String oldElement = linkedList.set(2, "New Element");// 輸出被替換的舊元素System.out.println("Replaced Element: " + oldElement);// 輸出修改后的LinkedListSystem.out.println("final: " + linkedList);}
}

(4)獲取元素

  • get(int index): 獲取指定位置的元素。

  • getFirst(): 獲取第一個元素。

  • getLast(): 獲取最后一個元素。

  • indexof(): 獲取指定對象的索引(從左到右第一個)

  • lastindexof(): 獲取指定對象的索引(從右到左第一個)

  • contains(): 是否包含指定元素

讓我們使用案例來幫助你進一步理解:

import java.util.LinkedList;public class LinkedListGetExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 獲取指定位置的元素String elementAtIndex = linkedList.get(1);System.out.println("Element at Index 1: " + elementAtIndex);// 獲取第一個元素String firstElement = linkedList.getFirst();System.out.println("First Element: " + firstElement);// 獲取最后一個元素String lastElement = linkedList.getLast();System.out.println("Last Element: " + lastElement);// 獲取指定對象的索引(從左到右第一個)int index = linkedList.indexOf("Element 1");System.out.println(index);// 獲取指定對象的索引(從右到左第一個)int lastindex = linkedList.lastIndexOf("Element 3");System.out.println(lastindex);// 是否包含指定元素boolean contains = linkedList.contains("Element 2");System.out.println(contains);}
}

通過上邊的案例加上解釋,相信讀者已經了解了Java中LinkedList中的常用API該如何使用了。

4.LinkedList的遍歷

? ? ? ? 在Java中遍歷LinkedList的方式有五種:分別是使用 for 循環、使用增強型 for 循環、使用 Iterator、使用 ListIterator、以及直接打印。

????????——接下來讓我們一個一個來進行講解:

(1)使用 for 循環

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 for 循環遍歷 LinkedListfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

(2)使用增強型 for 循環

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用增強型 for 循環遍歷 LinkedListfor (Integer element : list) {System.out.println(element);}}
}

(3)使用 Iterator

import java.util.LinkedList;
import java.util.Iterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 Iterator 遍歷 LinkedListIterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

(4)使用 ListIterator

import java.util.LinkedList;
import java.util.ListIterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 ListIterator 從前向后遍歷 LinkedListListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}// 使用 ListIterator 從后向前遍歷 LinkedListwhile (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}}
}

(5)直接打印

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 直接使用 System.out.println 打印 LinkedListSystem.out.println(list);}
}

——以上就是Java中遍歷LinkedList的五種方式。

5.LinkedList與ArrayList的區別

? ? ? ? 在學習完了LinkedList之后,有讀者就會發問,LinkedList和之前的ArrayList有什么區別呢?以下為LinkedList與ArrayList的區別:

不同點ArrayListLinkedList
存儲空間上物理上一定連續邏輯上連續,但物理上不一定連續
隨機訪問支持O(1)不支持:O(N)
頭插需要搬移元素,效率低O(N)只需修改引用的指向,時間復雜度為O(1)
插入空間不夠時需要擴容沒有容量的概念
應用場景元素高效存儲+頻繁訪問任意位置插入和刪除頻繁

????????以上就是LinkedList和之前的ArrayList的區別,讀者要在合適的情況下選擇合適的數據結構來進行操作。


以上就是本篇文章的全部內容了~~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43791.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux radix-tree 基數樹實現詳解

radix tree&#xff0c;又稱做基數樹&#xff0c;是一種適合于構建key(index)與value(item)相關聯的數據結構。內核中使用非常廣泛。本文主要聚焦linux內核基數樹的代碼實現,大量注釋過的代碼。 radix-tree組織結構如下: 1、數據結構 /** The bottom two bits of the slot de…

如何通過JSON-RPC向以太坊鏈發送簽名交易數據?

概述 在以太坊開發當中,通過web3.js、ethers.js等提供的API方法,都可以完成與以太坊的轉賬交易。那么如何通過以太坊JSON-RPC與以太坊進行交易呢? 在以太坊的JSON-RPC當中,有eth_sendRawTransaction這個方法,可以向以太坊網絡提交預簽名的交易廣播。 curl https://main…

IDEA阿里云OSS實現文件上傳·解決蒼穹外賣圖片回顯

簡單交代配置阿里云OSS的思路 1. 首先去阿里云開通一個OSS服務&#xff0c;配置好一個自己的Bucket 2. 在IDEA配置Bucket 3. 拷貝官網的OSS工具類代碼 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

同三維T80001編碼器(帶屏)系列視頻使用操作說明書:高清HDMI編碼器,高清SDI編碼器,4K超清HDMI編碼器,雙路4K超高清編碼器

同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1a;高清HDMI編碼器&#xff0c;高清SDI編碼器&#xff0c;4K超清HDMI編碼器&#xff0c;雙路4K超高清編碼器 同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1…

【C語言】printf、fprintf、sprintf,scanf、fscanf、sscanf的區別

目錄 前言 printf、fprintf、sprintf printf fprintf sprintf scanf、fscanf、sscanf scanf fscanf sscanf 前言 這幾個函數曾出現在面試中&#xff0c;因為函數名都差不多&#xff0c;所以很讓人迷惑啊~ 下面我們逐個分析。 printf、fprintf、sprintf 這三個函數的主…

子任務:IT運維的精細化管理之道

在當今的企業運營中&#xff0c;信息技術已成為支撐業務發展的核心力量。根據Gartner的報告&#xff0c;IT服務管理&#xff08;ITSM&#xff09;的有效實施可以顯著提升企業的運營效率&#xff0c;降低成本高達15%&#xff0c;同時提高服務交付速度和質量。隨著業務的復雜性和…

電腦工具箱神器——uTools

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/ 很多人腦子里都有一些一個月只用兩三次的軟件&#xff0c;這些軟件就這樣積滿了灰塵&#xff0c;需要的時候又不知道去哪里找。uTools 完美地解決…

筆記:在Entity Framework Core 中,常用Attribute有哪些

一、目的&#xff1a; Entity Framework Core (EF Core) 支持使用屬性&#xff08;Attributes&#xff09;來配置模型和映射數據庫。這些屬性提供了一種聲明性的方式來指定如何將類和屬性映射到數據庫表和列。以下是一些EF Core中常用的屬性&#xff1a; 二、實現 1. [Table] …

力扣題解(環繞字符串中唯一的子字符串)

467. 環繞字符串中唯一的子字符串 定義字符串 base 為一個 "abcdefghijklmnopqrstuvwxyz" 無限環繞的字符串&#xff0c;所以 base 看起來是這樣的&#xff1a; "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 給你一個字符串 s …

深入理解 MyBatis 的 SqlSession:MyBatis 核心接口全解析

MyBatis 是一個非常流行的 Java 持久層框架&#xff0c;它簡化了數據庫操作&#xff0c;并且提供了強大的映射特性。在 MyBatis 中&#xff0c;SqlSession 是與數據庫交互的核心接口。本文將詳細介紹 SqlSession 的功能和使用方法。 什么是 SqlSession&#xff1f; SqlSessio…

MYSQL審批流程判斷同一層級審批人是否全部通過審批

在做流程審批的時候&#xff0c;通常會出現某一層有多個審批人的情況&#xff0c;這個時候需要所有人都通過才會進入到下一步 數據結構如下圖表格所示 每一個審批申請對應一個apply_id serial_no相同的代表是同一層級審批人 approval_status是審核狀態 下面我們可以用一個SQL來…

Day50:單調棧 LeedCode 739. 每日溫度 496.下一個更大元素 I 503. 下一個更大元素 II

739. 每日溫度 給定一個整數數組 temperatures &#xff0c;表示每天的溫度&#xff0c;返回一個數組 answer &#xff0c;其中 answer[i] 是指對于第 i 天&#xff0c;下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 示例 1: 輸…

【蓄勢·致遠】 同為科技(TOWE)2024年年中會議

2024年7月2日-8日&#xff0c;同為科技&#xff08;TOWE&#xff09;召開2024年年中工作會議。會議回顧上半年總體工作情況&#xff0c;分析研判發展形勢&#xff0c;規劃部署下半年工作。 為期一周的工作會議&#xff0c;由同為科技&#xff08;TOWE&#xff09;創始人、董事長…

futures.toArray(new CompletableFuture[0])

futures.toArray(new CompletableFuture[0]) 是一種常見的將 List 轉換為數組的方式&#xff0c;特別是在需要將 List 傳遞給接受數組參數的方法時。讓我們詳細解釋一下這段代碼的具體含義和工作原理。 代碼解釋 假設 futures 是一個 List<CompletableFuture<Map<St…

【人臉識別、Python實現】PyQt5人臉識別管理系統

PyQt5人臉識別管理系統 項目描述主要功能效果展示獲取源碼 項目描述 接的一個基于宿舍管理系統與人臉識別的小單子。然后我把它優化了一些&#xff0c;現在開源一下。有需要的小伙伴自取&#xff0c;點個免費的關注就行 主要功能 1、錄入學生基本信息、錄入人臉 2、主頁面展…

【Django】Django 使用連接串配置數據庫

Django 使用連接串配置數據庫 Django 配置數據庫 修改 settings.py 中 DATABASES&#xff0c;這里以 mysql 數據庫為例。 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: your_database_name,USER: your_database_user,PASSWORD: your_database_password,HO…

深度|不同數據系統中的“一致性”(Consistency)含義的區別

“你們的系統能實現強一致性嗎&#xff1f;”作為過去幾年一直在開發流處理系統的從業者&#xff0c;我經常被問到這個問題。我時常想自信地推銷我們的產品&#xff0c;但現實情況是&#xff0c;回答這個問題并不簡單。其中的挑戰并不在于問題本身&#xff0c;而在于 “一致性”…

字節8年經驗之談!好用移動APP自動化測試框架有哪些?

移動App自動化測試框架是為了提高測試效率、降低測試成本而開發的一套工具和方法。好用的移動App自動化測試框架有很多&#xff0c;下面將介紹一些常用的框架&#xff0c;并提供一篇超詳細和規范的文章&#xff0c;從零開始幫助你搭建一個移動App自動化測試框架。 1. Appium&a…

筆記:在Entity Framework Core中使用DeleteBehavior配置外鍵級聯刪除

一、目的&#xff1a; 在Entity Framework Core中&#xff0c;DeleteBehavior枚舉定義了在刪除主實體時如何處理與之關聯的外鍵約束。DeleteBehavior.Cascade是DeleteBehavior枚舉的一個選項&#xff0c;它指定當刪除主實體時&#xff0c;所有具有外鍵引用的相關實體也將被自動…

十大優秀AI人工智能作詞軟件有哪些?

1、妙筆生詞&#xff1a;國內專業智能作詞工具&#xff0c;是一款非常優秀的國內作詞軟件&#xff0c;它可以選擇語言&#xff0c;風格&#xff0c;韻腳一鍵生成歌詞&#xff0c;也可以仿寫歌詞&#xff0c;可以續寫歌詞&#xff0c;可以智能取歌名&#xff0c;找優秀詞句&…