日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

List接口常用实现类的特点和底层实现

發布時間:2023/12/13 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 List接口常用实现类的特点和底层实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

List接口常用的實現類有3個:ArrayList、LinkedList、Vector。

那么它們的特點和底層實現有哪些呢?

ArrayList特點和底層實現


ArrayList底層是用數組實現的存儲。

特點:查詢效率高,增刪效率低,線程不安全。我們一般使用它。


圖1

查看源碼,我們可以看出ArrayList底層使用Object數組來存儲元素數據。所有的方法,都圍繞這個核心的Object數組來開展。


ArrayList是可以存放任意數量的對象,數組長度是有限的,那么是怎么實現的呢?

本質上就是通過定義新的更大的數組,將舊數組內容拷貝到新數組,來實現擴容。

ArrayList的Object數組初始化長度為10,如果我們存儲滿了這個數組,需要存儲第11個對象,就會定義新的數組長度長度更大的數組,并將將原數組內容和新的元素一起加入到新數組中,源碼中代碼如下:

?public?void?? ensureCapacity(int?? minCapacity) {

??? modCount++;

????int?? oldCapacity = elementData.length;

????if?? (minCapacity > oldCapacity) {

??? ??? Object oldData[] = ? elementData;

??? ????int?? newCapacity = (oldCapacity * 3)/2 + 1;

??? ?????if?? (newCapacity < minCapacity)

?????? newCapacity = minCapacity;

????????????// ? minCapacity is usually close to size, so this is a win:

??????????? elementData = ? Arrays.copyOf(elementData, newCapacity);

??? }

}

LinkedList特點和底層實現

LinkedList底層用雙向鏈表實現的存儲。

特點:查詢效率低,增刪效率高,線程不安全。

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據節點中都有兩個指針,分別指向前一個節點和后一個節點。?所以,從雙向鏈表中的任意一個節點開始,都可以很方便地找到所有節點。


每個節點都應該有3部分內容:

????class? Node {

?????? Node??previous;???//前一個節點

?????? Object??element;????//本節點保存的數據

?????? Node??next;???????//后一個節點

}

我們查看LinkedList的源碼,可以看到里面包含了雙向鏈表的相關代碼:


圖2

注:entry在英文中表示“進入、詞條、條目”的意思。在計算機英語中一般表示“項、條目”的含義。

Vector向量

Vector底層用數組實現的List,相關的方法都加了同步檢查,因此“線程安全,效率低”。?比如,indexOf方法就增加了synchronized同步標記。


【圖3】Vector的源碼(indexOf方法)

建議

如何選用ArrayList、LinkedList、Vector?

·線程安全時,用Vector。

·?局部變量不存在線程安全問題時,并且查找較多用ArrayList(一般使用它)

·局部變量不存在線程安全問題時,增加或刪除元素較多用LinkedList。




總結

以上是生活随笔為你收集整理的List接口常用实现类的特点和底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。