Java自己實現動態數組

?數組是由一組元素(值或變量)組成的數據結構,每個元素有至少一個索引或鍵來標識。

數組內的元素是連續存儲的,所以數組中元素的地址,可以通過其索引計算出來

空間占用

Java 中數組結構為

  • 8 字節 markword

  • 4 字節 class 指針(壓縮 class 指針的情況)

  • 4 字節 數組大小(決定了數組最大容量是 2^32)

  • 數組元素 + 對齊字節(java 中所有對象大小都是 8 字節的整數倍12,不足的要用對齊字節補足)

以下是動態數組的實現:

public class DynamicArray implements Iterable<Integer>{//邏輯大小private int size=0;//容量private int capacity=10;private int[] array;//數組尾部添加元素public void add(int element){add(size,element);}/***添加元素* @param index 向指定索引出添加數據* @param element  添加元素*/private void add(int index, int element) {//插入數據前對數組進行檢查checkAndGrow();if(index>=capacity){throw new RuntimeException("索引越界");}if(index>=0 && index <size){System.arraycopy(array,index,array,index+1,size-index);}array[index]=element;size++;}/*** 檢查數組大小* 若size==capacity則進行擴容*/public void checkAndGrow(){if(size==0){//初始化數組array=new int[capacity];}else if(size==capacity){//進行擴容,規則:當前容量+當前容量/2capacity +=capacity>>1;//創建新的數組int[] newArray=new int[capacity];System.arraycopy(array,0,newArray,0,size);//賦給原數組array=newArray;}}/***刪除元素* @param index 索引位置* @return 被刪除元素*/public int remove(int index){if(index>=capacity){throw new RuntimeException("索引越界");}int removed=array[index];if(index<size-1){System.arraycopy(array,index+1,array,index,size-index-1);}size--;return removed;}/*** 查詢元素* @param index 索引位置, 在 [0..size) 區間內* @return 該索引位置的元素*/public int get(int index){return array[index];}/*** 遍歷方法1* @param consumer 遍歷要執行的操作, 入參: 每個元素*/public void foreach(Consumer<Integer> consumer){for (int i = 0; i < size; i++) {// 提供 array[i]// 返回 voiconsumer.accept(array[i]);}}/*** 遍歷方法2 - 迭代器遍歷*/@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {int i = 0;@Overridepublic boolean hasNext() { // 有沒有下一個元素return i < size;}@Overridepublic Integer next() { // 返回當前元素,并移動到下一個元素return array[i++];}};}/*** 遍歷方法3 - stream 遍歷** @return stream 流*/public IntStream stream(){return IntStream.of(Arrays.copyOfRange(array, 0, size));}
}

插入或刪除性能

頭部位置,時間復雜度是 O(n)

中間位置,時間復雜度是 O(n)

尾部位置,時間復雜度是 O(1)(均攤來說)

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

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

相關文章

米家立式學習燈怎么樣?書客、米家、孩視寶三款護眼大路燈巔峰PK!

米家立式學習燈怎么樣?不知從什么時候開始&#xff0c;青少年成為了近視重災區&#xff0c;主要促成近視的原因有長時間接觸電子產品、學習時的不正確姿勢、不良的燈光環境等&#xff0c;除了減少電子產品的使用以及多室外活動之外&#xff0c;剩下的就是室內孩子經常學習的光…

全球首款集成GPT-4o的智能眼鏡AirGo Vision:AI眼鏡的未來

引言 在人工智能和大模型技術迅猛發展的今天&#xff0c;AI硬件產品逐漸走入人們的生活。繼Meta Ray-Ban智能眼鏡之后&#xff0c;Solos公司在最近的香港智能眼鏡峰會上發布了全球首款集成GPT-4o的智能眼鏡AirGo Vision。本文將深入探討這款AI智能眼鏡的功能、技術特點以及其在…

侯捷C++面向對象高級編程(下)-2-non-explicit one argument constructor

1.構造函數 構造函數: Fraction(int num, int den 1) 初始化分子和分母&#xff0c;允許指定分子 num 和可選的分母 den。默認情況下&#xff0c;分母為 1。 加法運算符重載: Fraction operator(const Fraction& f) 重載了加法運算符 。這使得兩個 Fraction 對象可以通過 …

Qt 異步實現事件的定時執行 - QTimer和QThread的聯合使用

異步實現事件的定時執行 - QTimer和QThread的聯合使用 引言一、核心源碼二、其信號和槽函數簡述三、定時器及其moveToThread簡述 引言 在 Qt 中&#xff0c;如果想要定時執行某些事件或函數&#xff0c;通常會使用 QTimer 類。QTimer 允許設置一個時間間隔&#xff0c;當這個時…

echarts使用自定義圖形實現3D柱狀圖

先看下效果吧 實現思路 使用graphic創建并注冊自定義圖形。根據每組的數據值&#xff0c;得到一個對應的點&#xff0c;從點出發用canvas繪制一組圖形&#xff0c;分別為 頂部的菱形 const CubeTop echarts.graphic.extendShape({buildPath: function (ctx, shape) {const c1…

c++ primer plus 第15章友,異常和其他,15.3.8exception 類

c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類 15.3.8exception 類 文章目錄 c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類15.3.8exception 類1.stdexcept異常類3.空指針和 new 15.3.8exception 類 C異常的主要目的是為設計容錯程序…

NVIDIA良心給顯卡免費升級,只為挨更多的罵

起猛了&#xff0c;還真的以為 NVIDIA 良心發現了。 眾所周知&#xff0c;英偉達對于咱們普通游戲玩家向來不屑一顧。只因為游戲業務在 NVIDIA 收入中占比較少。 在最新的 40 系顯卡 RTX 4070 Ti Super 顯卡中&#xff0c;NVIDIA悄悄給它來了一次核心「升級」&#xff0c;將原…

ARM學習(29)NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇

ARM學習&#xff08;28&#xff09;NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇 1、多種啟動方式介紹 IMX1166 支持多組flexSPI 引腳啟動&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通過boot cfg可以切換FlexSPI得實例。 每個實例又支持多組引腳&#xff0c;總共…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

Subclass-balancing Contrastive Learning for Long-tailed Recognition 核心公式解析溫度參數 τ \tau τ的作用公式5解析 核心公式解析 L S B C L ? ∑ i 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log ? exp ? ( z i ? z p ? / τ 1 ) ∑ z a ∈ V ~ i exp ? ( z i ? z…

LiteOS增加執行自定義源碼

開發過程注意事項&#xff1a; 源碼工程路徑不能太長 源碼工程路徑不能有中文 一定要關閉360等殺毒軟件&#xff0c;否則編譯的打包階段會出錯 增加自定義源碼的步驟: 1.創建源碼目錄 2. 創建源文件 新建myhello目錄后&#xff0c;再此目錄下再新建源文件myhello_demo.c 3. 編…

程序員學長 | PyCaret,一個超強的 python 庫

本文來源公眾號“程序員學長”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;PyCaret&#xff0c;一個超強的 python 庫 今天給大家分享一個超強的 python 庫&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 簡介 …

[論文筆記]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天帶來又一篇RAG論文筆記&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 檢索增強語言模型能夠更好地適應世界狀態的變化并融入長尾知識。然而&#xff0c;大多數現有方法只能從檢索語料庫中檢索到短的連續文本片段&#xff0…

random.choices 的參數及其應用

random.choices 是 Python 的 random 模塊中的一個函數&#xff0c;用于從給定的序列中隨機選擇元素&#xff0c;可以設置權重。這個函數在需要根據特定概率分布進行隨機選擇的場景中非常有用。下面是 random.choices 的參數及其詳細介紹&#xff1a; 文章目錄 參數應用示例基本…

釋放序列和同步

#include <iostream> #include<thread> #include<atomic> #include<vector> std::atomic<int>count(0); std::vector<int>queue_data; //如果存儲操作被標記為memory_order_release、memory_order_acq_rel或memory_order_seq_cst&#xff…

FP5207+音頻功率放大器的組合解決方案-適用于便攜式音頻播放器、無線耳機、智能音箱和車載音響系統等高質量音頻輸出需求的產品,以提高電池供電的效率和輸出功率

隨著消費者對智能家居的需求增長&#xff0c;智能音響市場成為重要增長點。同時&#xff0c;音響技術也在不斷發展&#xff0c;音響及揚聲器的功能和性能不斷提升。 藍牙音箱&#xff0c;這類音箱供電是以鋰電池為主&#xff0c;一般選用內置升壓的音頻功放芯片&#xff0c;音響…

iOS input 標簽 focus 失效

解決方案 <inputv-if"show"ref"inputRef" />watch(inputRef, (ref) > {ref?.focus(); });

vivado DQS_BIAS

DQS_偏差 DQS_BIAS是驅動差分輸入緩沖器的頂級端口的屬性&#xff0c;或者 雙向緩沖基元&#xff08;IBUFDS、IOBUFDS&#xff09;。 DQS_BIAS屬性在某些的輸入端提供可選的DC偏置 偽差分I/O標準&#xff08;DIFF_SSTL&#xff09;和真差分I/O規范&#xff08;LVDS&#xff09;…

windows 構建nginx本地服務隨系統自啟

1.先去官網下載一個nginxzip 2.將zip解壓&#xff0c;將nginx-server.exe文件放入文件夾 3.創建nginx-server.xml&#xff0c;將以下內容放進文件內 <service> <id>nginx</id> <name>Nginx Service</name> <description>High Per…

強化學習中的蒙特卡洛算法和時序差分算法

在強化學習&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;價值函數的估計是核心任務之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和時序差分&#xff08;Temporal Difference, TD&#xff09;方法是兩種常用的策略&#xff0c;用于估計狀態…

軟件架構之架構風格

軟件架構之架構風格 9.3 軟件架構風格9.3.1 軟件架構風格分類9.3.2 數據流風格9.3.3 調用/返回風格9.3.4 獨立構件風格9.3.5 虛擬機風格9.3.6 倉庫風格 9.4 層次系統架構風格9.4.1 二層及三層 C/S 架構風格9.4.2 B/S 架構風格9.4.3 MVC 架構風格9.4.4 MVP 架構風格 9.5 面向服務…