判讀一個對象不為空_ArrayList實現分析(一)——對象創建

e5c1daf9d8de934e95a55554cc3a9e77.png

ArrayList是java中最常用的集合類之一,它的內部實現是基于數組,因此ArryList可以根據索引實現隨機訪問。ArryList繼承了AbstractList類,并且實現了List, RandomAccess, Cloneable接口。下面詳細分析一下ArrayList的實現,下面的分析是基于JDK1.8版本。

ArrayList對象創建

ArryList有三個構造函數:

//創建一個默認大小的ArrayListpublic ArrayList() //創建一個initialCapacity大小的 ArrayListpublic ArrayList(int initialCapacity) //使用其他Collection對象,創建arrayListpublic ArrayList(Collection extends E> c) 

下面具體分析一下,每個構造方法是如何創建一個ArrayList對象,在深入構造方法之前,先看一下ArrayList幾個重要的成員變量:

//實際存儲數據的數組transient Object[] elementData; //列表實際存儲數據元素的個數private int size;//定義在AbstractList類中,//表示了隊列結構修改的次數,主要是當隊列大小發生變化時,//記錄變化次數protected transient int modCount = 0;//用于表示空實例的空數組對象實現private static final Object[] EMPTY_ELEMENTDATA = {};//表示創建默認大小的ArrayList實例,//主要是于EMPTY_ELEMENTDATA做區別,//個人認為EMPTY_ELEMENTDATA表示空ArrayList//DEFAULTCAPACITY_EMPTY_ELEMENTDATA表示是//默認大小的ArrayList,沒有本質上的區別private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

注意:對modCount字段用法說明參考ArrayList實現分析(二)——常用操作和ConcurentModificationException異常

在熟悉了上面的幾個字段,下面先看第一個構造函數:ArrayList()
少說廢話,先看東西:

public ArrayList() {        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}

從代碼上就可以直接看到了DEFAULTCAPACITY_EMPTY_ELEMENTDATA的用法,把它賦值給了elementData,也就是相當于
elementData = {},創建了一個包含零個元素的數組。

第二個構造函數:ArrayList(int initialCapacity) ,同樣先看東西:

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);        }}

在構造方法中,根據傳入的initialCapacity值分別進行不同的操作,如果是大于0,那么直接創建一個initialCapacity大小的數組對象,如果是等于0,那就使用EMPTY_ELEMENTDATA,這里就是使用上面說的EMPTY_ELEMENTDATA這個成員變量賦值,主要是為了代碼描述的更清晰;如果是小于0就拋出異常。
第三個構造函數:ArrayList(Collection extends E> c)

 public ArrayList(Collection extends E> c) {        elementData = c.toArray();        if ((size = elementData.length) != 0) {            //c.toArray might (incorrectly) not return Object[](see 6260652)            if (elementData.getClass() != Object[].class)                elementData = Arrays.copyOf(elementData,size,Object[].class);        } else {            //用空素組給elementData賦值            this.elementData = EMPTY_ELEMENTDATA;        }    }

使用這個構造函數,首先是講傳入的集合對象c通過toArray()方法把c轉換為Object數組類型賦值給elementData,這里還增加了一個判斷,就是判斷賦值后的elementData大小是否為0,如果是0表示,傳入的集合對象c包含0個元素,那么使用EMPTY_ELEMENTDATA給elementData復制,如果傳入的集合對象c不為空,那么需要再對elementData的實際類型進行判斷,因為根據源碼中注釋,在執行c.toArray()的時候,可能返回的類型不是 Object[].class,這是jdk的bug(經過查閱,該bug在jdk9已經修復),因此這里需要再次判斷一下elementData的類型是否是Object[],如果不是,那么需要利用elementData當前的值,重新創建一個Object[]類型的數組,并用 elementData指向新的數組地址。

注意Arrays.copyOf(elementData, size, Object[].class)方法的作用是使用elementData數組,創建一個新的數組,該數組的大小是size,類型是Object[].class

本文先介紹ArrayList的創建過程,下一篇文章,重點分析一下ArrayList的常用操作。

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

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

相關文章

AngularJS與Angular的區別

指同一事物,版本的區別,叫法不同 Angular2.0之前的版本(1.x)叫做AngularJS 1.x的使用是引入AngularJS的js文件到網頁。 2.0之后,就是完全不同了。 Angular2.x與Angular1.x 的區別類似 Java 和 JavaScript 或者說是…

網頁控制臺調用click()失敗_C# 調用百度AI 人臉識別

一、設置登錄百度云控制臺,添加應用-添加人臉識別,查找,對比等。設置人臉識別應用記住API Key和Secret Key二、創建Demo程序1、使用Nuget安裝 Baidu.AI 和 Newtonsoft.JsonNuget2、直接下載SDK https://ai.baidu.com/file/7D961BC013AB4AA790…

mysql查看服務器CPU和內存_怎么查看服務器的cpu和內存的硬件信息

可以按照如下方式進行操作:一、查看cpu總個數方法:1、首先執行top命令,如下圖中內容所表示。2、在top命令的顯示界面,按數字鍵1,即可查看到當前系統中的總cpu數,如下圖中內容所表示。二、查看總內存的方法&…

內核模式下的文件操作

內核模式下的文件操作 轉載于:https://www.cnblogs.com/endenvor/p/9119495.html

極光推送指定用戶推送_干貨|SpringBoot集成極光推送完整實現代碼(建議收藏)...

工作中經常會遇到服務器向App推送消息的需求,一般企業中選擇用極光推送的比較多,在集成極光時發現極光的文檔并不完整,網上的文章也很多不能直接使用,這里列出我在工作中集成極光的全部代碼,只需要按照如下代碼保證一次…

什么是ES6?

什么是ES6? ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發布了。Mozilla公司將在這個標準的基礎上,推出JavaScript 2.0。   ECMAScript和JavaScript到底是什么關系?很多…

Babylon-AST初探-代碼更新刪除(Update Remove)

通過前兩篇文章的介紹,大家已經了解了Create和Retrieve,我們接著介紹Update和 Remove操作。Update操作通常配合Create來完成。我們這篇文章主要介紹幾個常用的NodePathAPI:replace、insert、remove。具體也可以看babel-handbook中的Manipulat…

python中時間間隔默認單位是什么_Python時間增量(以年為單位)

你需要不止一個timedelta來說明多少年過去了;你還需要知道開始(或結束)日期。(這是閏年的事。)最好的方法是使用dateutil.relativedeltaobject,但這是第三方模塊。如果您想知道從某個日期起的datetime年(默認為現在),可以執行以下操作&#x…

編解碼異常分析

前言 最近在做的項目,有H264解碼的需求。部分H264文件解碼播放后,顯示為綠屏或者花屏。 分析 如何確認是否是高通硬解碼的問題 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

python讀取數據庫導出文件_python如何導出excel表格數據庫數據

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航,為用戶…

mysql堆溢出_為什么這個MySQL觸發器會導致堆棧溢出?

我今天遇到了同樣的問題,每次觸發都會導致堆棧溢出.原來我的Zend社區服務器安裝附帶了一個默認的my.cnf文件,其中thread_stack大小設置為128K,這導致每個線程中可用于堆棧的131072字節:mysql> show variables where Variable_name thread_stack;---------------…

MySQL定義數據庫對象之指定definer

mysql創建view、trigger、function、procedure、event時都會定義一個Definer: SQL SECURITY 有兩個選項,一個為DEFINER,一個為INVOKER;SQL SECURITY { DEFINER | INVOKER } :指明誰有權限來執行。DEFINER 表示按定義者擁有的權限來…

js根據name獲取value_js 函數的重載

js 函數的重載我們知道,很多編程語言都有函數的重載。所謂的重載,看定義:重載,簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間&#xff…

python調用菜單響應事件_[Python] wxpython 編程觸發菜單或按鈕事件

最近逐步熟悉wxpython,編寫了幾個小小功能的GUI程序,GUI中免不了會有在代碼中觸發控件事件的業務需求。在其他Gui界面的語言中有postevent、triggerevent 調用事件名稱的函數,非常方便。在wxpython里如何解決呢,上一段簡單的代碼。…

Angular CLI 使用教程指南參考

原文鏈接:http://www.cnblogs.com/bh4lm/p/6638057.html 點擊閱讀原文 ----------------------------------------------- Angular CLI 使用教程指南參考 Angular CLI 現在雖然可以正常使用但仍然處于測試階段. Angular CLI 依賴 Node 4 和 NPM 3 或更高版本. 安裝…

存儲過程循環遍歷一個月的每一天的函數_JavaScript 循環:如何處理 async/await

同步循環很久以前我寫的循環是這樣的:后來 JavaScript 提供了很多新的特性,現在我們會更傾向于用下面這種寫法:在開發過程可能會有這么一種需求,我們需要在循環中異步處理 item,那么可以怎么做呢?異步循環如…

Angular程序架構

component,組件是Angular應用的基本構建塊,你可以把一個組件理解為一段帶有業務邏輯和數據的html。組件下面可以有子組件,子組件下有孫子組件,像樹一樣。指令:允許你向html元素添加自定義行為。模塊Ngmodule&#xff1…

sqllite能連接mysql_SQLLite 可以通過SQL語言來訪問的文件型SQL數據庫

Web Storage分為兩類:- sessionStorage:數據保存在session 對象中(臨時)- localStorage:數據保存在本地硬件設備中(永久)sessionStorage:保存數據的兩種方法:sessionStorage.setItem(key,val);sessionStorage.key val;讀取數據的…

迭代器模式(Iterator)

迭代器模式 一. 迭代器模式 1.1 定義 提供一種方法順序訪問一個集合對象中的各種元素,而又不暴露該對象的內部表示.1.2 角色 抽象迭代器接口(Iterator).具體迭代器(ConcreteIterator).抽象聚合接口(Aggrega…

Angular啟動過程介紹

1、啟動時加載了哪個頁面?2、啟動時加載了哪些腳本?3、這些腳本做了什么事?打開Angular的命令行文件.angular-cli.json。apps節點下面。首先加載 index.html 頁面。此時瀏覽器顯示index.html的內容。再加載main.ts腳本"apps": [{..…