Java集合之ArrayList

来源:https://www.cnblogs.com/yanghanwen/archive/2019/12/05/11992655.html
-Advertisement-
Play Games

一、基礎 ArrayList不是線程安全的,多線程建議使用Vector或者CopyOnWriteArrayList; 底層實現是Object數組。預設容量DEFAULT_CAPACITY為10,最大數組大小MAX_ARRAY_SIZE為Integer.MAX_VALUE-8; 實現了RandomAc ...


一、基礎

  ArrayList不是線程安全的,多線程建議使用Vector或者CopyOnWriteArrayList;

  底層實現是Object數組。預設容量DEFAULT_CAPACITY為10,最大數組大小MAX_ARRAY_SIZE為Integer.MAX_VALUE-8;

  實現了RandomAccess介面,表明可以快速隨機訪問;

  實現了Cloneable介面,表明能被克隆;

  實現了Serializabble介面,表明能序列化之後傳輸;

二、源碼方法

  構造函數:

  無參構造函數ArrayList(),構造一個用於空實例的共用空數組實例

  一個int類型參數的構造函數 ArrayList(int initialCapacity)構造一個具有指定初始容量的空列表

  一個指定collection的構造函數ArrayList(Collection<? extends E> c)構造一個包含指定collection的元素的列表,這些元素是按照該collection的迭代器返回它們的順序排列的

  方法:

  size():返回數組大小

  isEmpty():返回數組是否為空

  contains(Object o):返回是否包含某對象

  clear():從此列表中刪除所有元素,並且將siz置為0

  ensureCapacity(int minCapacity):將數組容量擴容至指定大小

  addAll(Collection<? extends E> c):將指定集合的所有元素追加到list末尾

  removeAll(Collection<?> c):從此列表中刪除包含在其中的所有元素指定的集合

  indexOf(Object o):如果包含則返回指定元素首次出現的索引,不包含則返回-1

  lastIndexOf(Object o):如果包含則返回指定元素最後出現的索引,不包含則返回-1

  removeRange(int fromIndex, int toIndex):從該列表中刪除索引在之間的所有元素

  trimToSize():將elementData的數組設置為ArrayList實際的容量,刪除動態增長的多餘容量

  remove(Object o):從此列表中刪除第一次出現的指定元素,刪除成功返回true,否正返回false

  addAll(int index, Collection<? extends E> c):從指定位置開始,將指定集合中的所有元素插入到此列表

  retainAll(Collection<?> c):僅保留此列表中包含在指定的集合的元素, 換句話說,從此列表中刪除所有未包含在指定集合中的元素

  get(int index)、set(int index, E element)、add(E e)、add(int index, E element)、remove(int index)、

三、擴容

  ArrayList初始大小為0,在添加第一個元素的時候,調用add方法,進入add方法時,需要先確定容量足以放下這個元素

  進入ensureCapacityInternal()方法,傳入值為(當前size+1),然後判斷當前數組是否為預設的空數組,滿足條件,則最小擴容需要值為(當前size+1)和預設容量中較大的一個值。不是預設的空數組,則最小擴容需要值為(當前size+1)大小

  然後進入ensureExplicitCapacity()方法,傳入最小擴容需要值,然後判斷最小擴容需要值和當前對象數組的長度,如果最小擴容需要值大於當前的數組長度,則調用grow()方法進行擴容

  擴容時,暫定擴容值大小為原大小+原大小右移一位(偶數的1.5倍,奇數-1的1.5倍),記為newCapacity,然後判斷暫定擴容值和最小容量需要值,擴容值兩者中較大值。然後再比較擴容值和數組容量最大值,如果超過了數組容量最大值,再進入hugeCapacity()進入特殊處理。

  hugeCapacity()方法中,先判斷最小擴容需要值是否為負數,是的話,則拋出記憶體溢出錯誤。否則判斷最小擴容需要值和Integer的最大值-8比較,再確定最終的擴容值,減去的8位存放的是數組的長度

  確定了擴容值之後,就進行擴容操作,根據擴容值新建數組,然後拷貝數組,數組拷貝時調用的是本地方法 System.arraycopy() ,在C語言方法中調用frenn()釋放了原數組。

總結:

  自動擴容不易,在新建ArrayList時,可以指定大小,或者在新增大量元素之前,可以調用ensureCapacity(int minCapacity)方法先手動擴容


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從 2004 年發佈 1.0 版本開始,Spring 目前已經演進至 5.x 版本了,為不同時期的應用開發提供了強有力的支撐。現在我們正面對微服務、DevOps、雲計算這些新的挑戰,Spring 家族的新生力量 Spring Cloud 又將給我們提供哪些方面的支撐呢? ...
  • Spring Cloud,它將幫我們填平橫跨在應用開發與微服務、DevOps、雲計算之間的溝壑,讓我們輕鬆擁抱雲上微服務,但你知道它是如何做到的嗎?你對它有全面的瞭解嗎?你知道如何正確使用它嗎?新概念新技術層出不窮,讓人雲里霧裡,你是否想撥開雲霧對它們有更清晰的認知? ...
  • 類的變數分成2種: 1、成員變數 概念:在構造方法中的變數,前面帶有self 作用:可以在類中不同的方法間使用 2、類變數-靜態變數 概念:在類中,構造方法和普通方法之外,定義的變數 作用: 1、調用 1、類名可以調用 類名.類變數 2、對象名也可以調用 對象名.類變數 ... ...
  • 原鏈接:https://zhuanlan.zhihu.com/p/73001806 在使用PC時與PC交互的主要途徑是看屏幕顯示、聽聲音,點擊滑鼠和敲鍵盤等等。在自動化辦公的趨勢下,繁瑣的工作可以讓程式自動完成。比如自動化測試、自動下單交易等。很多軟體除了可以GUI方式操作外還可以用CLI介面操作, ...
  • IO概述 當我們在生活中把電腦上的數據拷貝到U盤或者硬碟上時,就是進行數據傳輸,按照數據的流動方向,我們分為輸入(input)和輸出(output),即就是所謂IO流 Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫出數據 IO的分 ...
  • ——日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第七篇。 簡介 上一章我們一起學習了Java NIO的核心組件Buffer,它通常跟Channel一起使用,但是它們在網路IO中又該如何使用呢,今天我們將一起學習另一個NIO核心組件—— Selector ,沒有它可以說就乾不起來網路I ...
  • 在控制面板的程式與功能里啟用和關閉windows功能打開,適用於linux的windows子系統 在微軟商店裡搜索ubuntu,直接點擊安裝就可以了 安裝完成後的windows與linux的磁碟映射見下圖 配置開發環境,下載和安裝vscode,打開後直接讓安裝一個擴展可以連接子系統的目錄 windo ...
  • Java編程思想總結(一)對象導論 1.1 抽象過程 萬物皆對象。 程式是對象的集合(即:類),他們通過發送消息(調用方法)來告知彼此要做的。 每個對象都有自己的由其他對象所構成的存儲(引用其他對象或基本類型,即組合)。 每個對象都擁有其類型。每個類最重要的區別於其他類的特征就是“可以發送什麼樣的消 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...