【ArrayList是如何擴容(ArrayList、LinkedList、與Vector的區別)】

ArrayList、LinkedList、與Vector的區別

  • 解讀
    • ArrayList 是一個可改變大小的數組
    • LinkedList 是一個雙向鏈表
    • Vector 屬強同步類
  • 拓展知識面
    • ArrayList是如何擴容?
    • 如何利用List實現LRU?

解讀

List主要有ArrayList、LinkedList與Vector幾種實現。這三者都實現了List接口,使用方式也極其相似,主要區別在于因為實現方式的不同,所以對不同的操作就有不同的效率。

ArrayList 是一個可改變大小的數組

當,更多的元素加入到ArrayList中時,其大小將會動態的增長,內部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質上就是數組。

LinkedList 是一個雙向鏈表

在添加和刪除元素的時間具有比ArrayList更好的性能,但是在get與set方面是弱于ArrayList。當然了,這些對比都是指數據量很大或者操作很頻繁的情況下的對比,如果數據量和運算量很小,那么就沒有對比的意義。

Vector 屬強同步類

Vector和ArrayList類似,但它屬于強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合或者對象),那么使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求是它自身大小的雙倍空間,而ArrayList每次對size增長50%。
而LinkedList還實現了Queue個Deque接口,該接口與List相比,其提供了更多的方法,包括offer()、peek()、poll()等。

注意:默認情況下ArrayList的初始容量非常小,所以如果可以預估數據量的話,分配一個較大的初始值才屬于最佳操作,這樣可以減少調整大小的開銷。

拓展知識面

ArrayList是如何擴容?

首先,我們要明白ArrayList是基于數組的,這個上面講到了,我們都知道,申請數組的時間,只能申請一個定長的數組,那么List是如何實現數組擴容的呢???ArrayList的擴容有幾個步驟:

  1. 檢查新增元素后是否會超過數組的容量,若超過,則進行下一步擴容;
  2. 設置新增容量為原始(舊/老)容量的1.5倍,最多不超過2^31-1(在Java8中ArrayList的容量最大是Integer.MAX_VALUE-8,這是由于在Java8中,ArrayList內部實現進行了一些改進,使用了一些數組復制的技巧來提高性能和內存的利用率,而這些技巧需要額外的8個元素的空間來進行優化)。
  3. 之后呢,申請一個容量為1.5倍的數組,將原有數組的元素復制到新數組中,自此,擴容完成。

如何利用List實現LRU?

LRU,即最近最少使用策略,基于時空局部性原理(最近訪問的,未來也會被訪問的),往往作為緩存淘汰的策略,如Redis和GuavaMap都使用了這種套胎策略。

我們可以基于LinkedList來實現LRU,因為LinkedList基于雙向鏈表,每個節點都會記錄上一個和下一個的節點,具體實現方式如下:

public class LruListCache<E> {private final int maxSize;private final LinkedList<E> list = new LinkedList<>();public LruListCache (int maxSize) {this.maxSize = maxSize;} public void add(E e) {if(list.size() < maxSize) {list.addFrist(e);}else{list.removeLast(); list.addFrist(e);}}public E get(int index) {E e = list.get(index);list.remove(e);add(e);return e;}@Overridepublic String toString() {return list.toString();}}

OK,如果不懂數組和鏈表的區別的話,隨后我有一個專門的數據結構的專欄,會講到棧和隊列、數組和鏈表以及二叉樹的遍歷等等內容。會做詳細解說。

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

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

相關文章

[論文筆記] Scaling Laws for Neural Language Models

概覽: 一、總結 計算量、數據集大小、模型參數量大小的冪律 與 訓練損失呈現 線性關系。 三個參數同時放大時,如何得到最佳的性能? 更大的模型 需要 更少的樣本 就能達到相同的效果。 </

開源WIFI繼電器之源代碼

源代碼:WiFiRelay: 基于ESP8285的WiFi繼電器代碼

筆記本外接顯示器的一些基本操作

1>&#xff0c;安裝問題直接問客服&#xff0c;正常情況是將顯示屏接上電源&#xff0c;然后用先將顯示屏和筆記本的HDMI接口連接即可。 按下組合鍵 win p ,選擇 “復制”。 2>&#xff0c;接上顯示屏后&#xff0c;原筆記本無聲音&#xff1f; 1、找到筆記本電腦右下…

Doris 建表示例(七)

建表語法 使用 CREATE TABLE 命令建立一個表(Table)。更多詳細參數可以查看&#xff1a; HELP CREATE TABLE; 建表語法&#xff1a; CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name(column_definition1[, column_definition2, ...][, index_definition1[, i…

阿里云99元服務器ECS經濟型e實例性能如何?測評來了

阿里云服務器優惠99元一年&#xff0c;配置為云服務器ECS經濟型e實例&#xff0c;2核2G配置、3M固定帶寬和40G ESSD Entry系統盤&#xff0c;CPU采用Intel Xeon Platinum架構處理器&#xff0c;2.5 GHz主頻&#xff0c;3M帶寬下載速度384KB/秒&#xff0c;上傳速度1028KB/秒&am…

人工智能對我們的生活影響

目錄 前言 一、人工智能的領域 二、人工智能的應用 三、對人工智能的看法 總結 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高興與大家相識&#xff0c;希望我的博客能對你有所幫助。 &#x1f4a1;本文由Filotimo__??原創&#xff0c;首發于CSDN&#x1f4…

運算與表達式模板(第一節)

目錄 前言 一、表達式模板簡介 為什么引入表達式模板&#xff1f; 緩式求值&#xff08;Memoization&#xff09; 關系 好處 前言 一個深度學習框架的初步實現為例&#xff0c;討論如何在一個相對較大的項目中深入應用元編程&#xff0c;為系統優化提供更多的可能。 以…

阿里云服務器ECS經濟型e實例優惠99元性能怎么樣?

阿里云服務器ECS經濟型e實例優惠99元性能怎么樣&#xff1f;阿里云服務器優惠99元一年&#xff0c;配置為云服務器ECS經濟型e實例&#xff0c;2核2G配置、3M固定帶寬和40G ESSD Entry系統盤&#xff0c;CPU采用Intel Xeon Platinum架構處理器&#xff0c;2.5 GHz主頻&#xff0…

使用NPOI處理EXCEL文件:例1-關于優化的一些問題

記得有一次處理Excel文件對比&#xff0c;自己前后使用VBA和NPOI對比了下效率。由于涉及到頁面的渲染和刷新&#xff0c;二者的處理速度差了個數量級&#xff08;10多秒和幾十分鐘的差別&#xff09;。當然使用NPOI操作時也做了一定優化。印象這么深刻這次一有需求就想到了NPOI…

千云物流 - 使用k8s負載均衡openelb

openelb的介紹 具體根據官方文檔進行安裝官方文檔,這里作為測試環境的安裝使用. OpenELB 是一個開源的云原生負載均衡器實現,可以在基于裸金屬服務器、邊緣以及虛擬化的 Kubernetes 環境中使用 LoadBalancer 類型的 Service 對外暴露服務。OpenELB 項目最初由 KubeSphere 社區…

redis的性能管理及集群架構(主從復制、哨兵模式)

一、redis的性能管理 1、內存指標info memory 內存指標&#xff08;重要&#xff09; used_memory:853736 數據占用的內存 used_memory_rss:10551296 redis向操作系統申請的內存 used_memory_peak:853736 redis使用內存的峰值 注&#xff1a;單位&#xff1a;字節 系…

策略模式應用(內窺鏡項目播放不同種類的視頻)

新舊代碼對比 策略模式 基本概念 策略模式是一種行為設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來&#xff0c;并且使它們可以互相替換。策略模式允許客戶端選擇算法的具體實現&#xff0c;而不必改變客戶端的代碼。這樣&#xff0c;客戶端代碼就…

中國區域250米歸一化植被指數數據集(2000-2022)

中國區域250米歸一化植被指數數據集(2000-2022)數據集是中國區域2000至2022年月度歸一化植被指數產品&#xff0c;空間分辨率250米&#xff0c;合成方式采用月最大值合成&#xff0c;每年12期&#xff0c;共275期。本產品是基于Aqua/Terra-MODIS衛星傳感器MOD13Q1產品以及土地利…

寄存器、緩存、內存之間的關系和區別

https://blog.csdn.net/m0_46761060/article/details/124689209 目錄 關系1、寄存器2、緩存&#xff08;Cache&#xff09; 2.1、寄存器和緩存的區別2.2、一級緩存和二級緩存3、內存 3.1、只讀存儲器 ROM&#xff08;Read Only Memory&#xff09;3.2、隨機存儲器 RAM&#xf…

基于LLM+場景識別+詞槽實體抽取實現多輪問答

前言 隨著人工智能技術的不斷進步&#xff0c;大語言模型&#xff08;LLM&#xff09;已成為技術前沿的熱點。它們不僅能夠理解和生成文本&#xff0c;還能在多種應用場景中實現復雜的交互。本文將深入探討一段結合了大語言模型能力、意圖識別和詞槽實體抽取的Python代碼&…

鏈表OJ--上

文章目錄 前言一、反轉鏈表二、移除鏈表元素三、鏈表中倒數第K個結點四、相交鏈表五、鏈表的中間結點 前言 一、反轉鏈表 力扣206&#xff1a;反轉鏈表- - -點擊此處傳送 思路圖&#xff1a; 方法一&#xff1a;改變指向 方法二&#xff1a; 代碼&#xff1a; //方法一 /…

十一、h.264編碼

前言 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12 使用H.264編碼對YUV視頻進行壓縮 ffmpeg -s 640x480 -pix_fmt yuv420p -i in.yuv -c:v libx264 out.h264 -c:v libx264是指定使用libx264作為編碼器完整代碼&#xff1a; H264EncodeThread.h #ifnd…

用HALCON標定助手對相機進行標定

任務要求&#xff1a; 已知相機鏡頭焦距f為8mm&#xff0c;相機單個CCD像素在水平和豎直兩個方向上的尺寸均為3.75微米&#xff0c;相機為普通透光鏡頭和面陣相機&#xff0c;對相機進行標定&#xff0c;測量相機的內外參數。 操作步驟&#xff1a; 1. 在HALCON中運行gen_ca…

C#使用whisper.net實現語音識別(語音轉文本)

目錄 介紹 效果 輸出信息 項目 代碼 下載 介紹 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下載地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…

Nginx高級

Nginx高級 第一部分&#xff1a;擴容 通過擴容提升整體吞吐量 1.單機垂直擴容&#xff1a;硬件資源增加 云服務資源增加 整機&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 網卡&#xff1a;10G/40G網卡 磁盤&#xff1a;SAS(SCSI) HDD&#xff08;機械…