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

Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實(shí)現(xiàn)

 更新時(shí)間:2023年04月27日 11:17:08   作者:ZIYE_190  
LinkedList是Java中常用的數(shù)據(jù)結(jié)構(gòu)之一,實(shí)現(xiàn)了鏈表的特性,支持快速添加、刪除元素,可以用于實(shí)現(xiàn)隊(duì)列、棧、雙向隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。LinkedList的內(nèi)部實(shí)現(xiàn)采用了雙向鏈表,其中每個(gè)節(jié)點(diǎn)都包含前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的引用,可以直接訪問鏈表的頭尾元素

1.ArrayList的缺陷

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
	// ...
	// 默認(rèn)容量是10
	private static final int DEFAULT_CAPACITY = 10;
	//...
	// 數(shù)組:用來存儲(chǔ)元素
	transient Object[] elementData; // non-private to simplify nested class access
	// 有效元素個(gè)數(shù)
	private int size;
	public ArrayList(int initialCapacity) {
		if (initialCapacity > 0) {
			this.elementData = new Object[initialCapacity];
		} else if (initialCapacity == 0) {
			this.elementData = EMPTY_ELEMENTDATA;
				} else {
						throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
				}
		} 
		// ...
}

由于其底層是一段連續(xù)空間,當(dāng)在ArrayList任意位置插入或者刪除元素時(shí),就需要將后序元素整體往前或者往后搬移,時(shí)間復(fù)雜度為O(n),效率比較低,因此ArrayList不適合做任意位置插入和刪除比較多的場(chǎng)景。因此:java集合中又引入了LinkedList,即鏈表結(jié)構(gòu)

2.LinkedList

LinkedList概念

LinkedList的底層是雙向鏈表結(jié)構(gòu),由于鏈表沒有將元素存儲(chǔ)在連續(xù)的空間中,元素存儲(chǔ)在單獨(dú)的節(jié)點(diǎn)中,然后通過引用將節(jié)點(diǎn)連接起來了,因此在在任意位置插入或者刪除元素時(shí),不需要搬移元素,效率比較高。

在集合框架中,LinkedList也實(shí)現(xiàn)了List接口,具體如下:

說明:

  • LinkedList實(shí)現(xiàn)了List接口
  • LinkedList的底層使用了雙向鏈表
  • LinkedList沒有實(shí)現(xiàn)RandomAccess接口,因此LinkedList不支持隨機(jī)訪問
  • LinkedList的任意位置插入和刪除元素時(shí)效率比較高,時(shí)間復(fù)雜度為O(1)

LinkedList的使用

LinkedList的構(gòu)造

方法解釋
LinkedList()無參構(gòu)造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素構(gòu)造List
public static void main(String[] args) {
	// 構(gòu)造一個(gè)空的LinkedList
	List<Integer> list1 = new LinkedList<>();
	List<String> list2 = new java.util.ArrayList<>();
	list2.add("JavaSE");
	list2.add("JavaWeb");
	list2.add("JavaEE");
	// 使用ArrayList構(gòu)造LinkedList
	List<String> list3 = new LinkedList<>(list2);
}

LinkedList的其他常用方法介紹 

方法解釋
boolean add(E e)尾插 e
void add(int index, E element)將 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E remove(int index)刪除 index 位置元素
boolean remove(Object o)刪除遇到的第一個(gè) o
E get(int index)獲取下標(biāo) index 位置元素
\E set(int index, E element)將下標(biāo) index 位置元素設(shè)置為 element
void clear()清空
boolean contains(Object o)判斷 o 是否在線性表中
int indexOf(Object o)返回第一個(gè) o 所在下標(biāo)
int lastIndexOf(Object o)返回最后一個(gè) o 的下標(biāo)
List subList(int fromIndex, int toIndex)截取部分 list
public static void main(String[] args) {
	LinkedList<Integer> list = new LinkedList<>();
	list.add(1); // add(elem): 表示尾插
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);
	list.add(6);
	list.add(7);
	System.out.println(list.size());
	System.out.println(list);
	// 在起始位置插入0
	list.add(0, 0); // add(index, elem): 在index位置插入元素elemSystem.out.println(list);
	list.remove(); // remove(): 刪除第一個(gè)元素,內(nèi)部調(diào)用的是removeFirst()
	list.removeFirst(); // removeFirst(): 刪除第一個(gè)元素
	list.removeLast(); // removeLast(): 刪除最后元素
	list.remove(1); // remove(index): 刪除index位置的元素
	System.out.println(list);
	// contains(elem): 檢測(cè)elem元素是否存在,如果存在返回true,否則返回false
	if(!list.contains(1)){
		list.add(0, 1);
	} 
	list.add(1);
	System.out.println(list);
	System.out.println(list.indexOf(1)); // indexOf(elem): 從前往后找到第一個(gè)elem的位置
	System.out.println(list.lastIndexOf(1)); // lastIndexOf(elem): 從后往前找第一個(gè)1的位置
	int elem = list.get(0); // get(index): 獲取指定位置元素
	list.set(0, 100); // set(index, elem): 將index位置的元素設(shè)置為elem
	System.out.println(list);
	// subList(from, to): 用list中[from, to)之間的元素構(gòu)造一個(gè)新的LinkedList返回
	List<Integer> copy = list.subList(0, 3);
	System.out.println(list);
	System.out.println(copy);
	list.clear(); // 將list中元素清空
	System.out.println(list.size());
}

LinkedList的遍歷

public static void main(String[] args) {
	LinkedList<Integer> list = new LinkedList<>();
	list.add(1); // add(elem): 表示尾插
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);
	list.add(6);
	list.add(7);
	System.out.println(list.size());
	// foreach遍歷
	for (int e:list) {
		System.out.print(e + " ");
	} 
	System.out.println();
	// 使用迭代器遍歷---正向遍歷
	ListIterator<Integer> it = list.listIterator();
	while(it.hasNext()){
		System.out.print(it.next()+ " ");
	} 
	System.out.println();
	// 使用反向迭代器---反向遍歷
	ListIterator<Integer> rit = list.listIterator(list.size());
	while (rit.hasPrevious()){
	System.out.print(rit.previous() +" ");
	} 
	System.out.println();
}

3.鏈表的概念及結(jié)構(gòu)

鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈接次序?qū)崿F(xiàn)的 。

實(shí)際中鏈表的結(jié)構(gòu)非常多樣,以下情況組合起來就有8種鏈表結(jié)構(gòu):

  • 單向或者雙向
  • 帶頭或者不帶頭
  • 循環(huán)或者非循環(huán)

雖然有這么多的鏈表的結(jié)構(gòu),但是我們重點(diǎn)掌握兩種:

  • 無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多。
  • 無頭雙向鏈表:在Java的集合框架庫中LinkedList底層實(shí)現(xiàn)就是無頭雙向循環(huán)鏈表。

4.ArrayList和LinkedList的區(qū)別

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

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java LinkedList內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于java文本復(fù)制的7種方式總結(jié)

    基于java文本復(fù)制的7種方式總結(jié)

    下面小編就為大家分享一篇基于java文本復(fù)制的7種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java環(huán)境變量path和classpath的配置

    java環(huán)境變量path和classpath的配置

    這篇文章主要為大家詳細(xì)介紹了java系統(tǒng)環(huán)境變量path和classpath的配置過程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • springboot中redis正確的使用詳解

    springboot中redis正確的使用詳解

    本文主要介紹了springboot中redis正確的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Spring的InitializingBean接口解析

    Spring的InitializingBean接口解析

    這篇文章主要介紹了Spring的InitializingBean接口解析,InitializingBean是spring為bean的初始化提供了一種新的方式,里面只有一個(gè)方法afterPropertiesSet,作用就是實(shí)現(xiàn)這個(gè)接口或者實(shí)現(xiàn)了繼承InitializingBean的方法的bean都要執(zhí)行這個(gè)方法,需要的朋友可以參考下
    2024-02-02
  • Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • java使用文件流實(shí)現(xiàn)查看下載次數(shù)

    java使用文件流實(shí)現(xiàn)查看下載次數(shù)

    這篇文章主要為大家詳細(xì)介紹了java使用文件流實(shí)現(xiàn)查看下載次數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • java實(shí)現(xiàn)簡(jiǎn)單猜拳小游戲

    java實(shí)現(xiàn)簡(jiǎn)單猜拳小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單猜拳小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Spring?Boot項(xiàng)目中使用OpenAI-Java的示例詳解

    Spring?Boot項(xiàng)目中使用OpenAI-Java的示例詳解

    Spring?Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了Spring?Boot項(xiàng)目中使用OpenAI-Java的示例詳解,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

正镶白旗| 水城县| 阳曲县| 铜山县| 和林格尔县| 岳西县| 铜川市| 桂林市| 陆川县| 安国市| 浦北县| 阿荣旗| 扶沟县| 石泉县| 崇义县| 岢岚县| 河源市| 葵青区| 富裕县| 松滋市| 巍山| 舞阳县| 莫力| 兰西县| 莱阳市| 施秉县| 离岛区| 军事| 沁源县| 永春县| 六盘水市| 竹北市| 文安县| 晋中市| 安新县| 石林| 海兴县| 湟源县| 文山县| 祁连县| 贵阳市|