欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java ArrayList深入源碼層分析

 更新時(shí)間:2023年01月17日 14:05:44   作者:做網(wǎng)安的小王  
Java中容器對(duì)象主要用來(lái)存儲(chǔ)其他對(duì)象,根據(jù)實(shí)現(xiàn)原理不同,主要有3類常用的容器對(duì)象:ArrayList使用數(shù)組結(jié)構(gòu)存儲(chǔ)容器中的元素、LinkedList使用鏈表結(jié)構(gòu)存儲(chǔ)容器中的元素

概述

ArrayList是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,其容量能自動(dòng)增長(zhǎng),類似于C語(yǔ)言中的動(dòng)態(tài)申請(qǐng)內(nèi)存,動(dòng)態(tài)增長(zhǎng)內(nèi)存。

ArrayList不是線程安全的,只能用在單線程環(huán)境下,多線程環(huán)境下可以考慮用Collections.synchronizedList(List l)函數(shù)返回一個(gè)線程安全的ArrayList類,也可以使用concurrent并發(fā)包下的CopyOnWriteArrayList類。

ArrayList實(shí)現(xiàn)了Serializable接口,因此它支持序列化,能夠通過(guò)序列化傳輸,實(shí)現(xiàn)了RandomAccess接口,支持快速隨機(jī)訪問(wèn),實(shí)際上就是通過(guò)下標(biāo)序號(hào)進(jìn)行快速訪問(wèn),實(shí)現(xiàn)了Cloneable接口,能被克隆。

每個(gè)ArrayList實(shí)例都有一個(gè)容量,該容量是指用來(lái)存儲(chǔ)列表元素的數(shù)組的大小。它總是至少等于列表的大小。隨著向ArrayList中不斷添加元素,其容量也自動(dòng)增長(zhǎng)。自動(dòng)增長(zhǎng)會(huì)帶來(lái)數(shù)據(jù)向新數(shù)組的重新拷貝,因此,如果可預(yù)知數(shù)據(jù)量的多少,可在構(gòu)造ArrayList時(shí)指定其容量。在添加大量元素前,應(yīng)用程序也可以使用ensureCapacity操作來(lái)增加ArrayList實(shí)例的容量,這可以減少遞增式再分配的數(shù)量。

注意,此實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)ArrayList實(shí)例,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了列表,那么它必須保持外部同步。

ArrayList繼承AbstractList,實(shí)現(xiàn)了List、 RandomAccess、Cloneable、Serializable接口, 為ArrayList內(nèi)部是用一個(gè)數(shù)組存儲(chǔ)元素值,相當(dāng)于一個(gè)大小可變的數(shù)組,也就是動(dòng)態(tài)數(shù)組。 由于ArrayList底層是數(shù)組實(shí)現(xiàn)的,所以可以隨機(jī)訪問(wèn)。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable 

(1)繼承和實(shí)現(xiàn)繼承了AbstractList,實(shí)現(xiàn)了List:ArrayList是一個(gè)數(shù)組隊(duì)列,提供了相關(guān)的添加、刪除、修改、遍歷等功能。實(shí)現(xiàn)RandmoAccess接口:即提供了隨機(jī)訪問(wèn)功能。RandmoAccess是java中用來(lái)被List實(shí)現(xiàn),為L(zhǎng)ist提供快速訪問(wèn)功能的在ArrayList中,我們即可以通過(guò)元素的序號(hào)快速獲取元素對(duì)象;這就是快速隨機(jī)訪問(wèn)。實(shí)現(xiàn)了Cloneable接口:即覆蓋了函數(shù)clone(),能被克隆。實(shí)現(xiàn)java.io.Serializable接口:這意味著ArrayList支持序列化,能通過(guò)序列化去傳輸。

(2)線程安全ArrayList不是線程安全的。建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。同樣,HashMap也是線程不安全的,如果需要并發(fā)訪問(wèn)應(yīng)該使用Hashtable(遺留類)或ConcurrentHashMap。

private static final int DEFAULT_CAPACITY = 10;//默認(rèn)容量是10 

私有屬性:

/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */ private transient Object[] elementData; /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; 

elementData存儲(chǔ)ArrayList內(nèi)的元素,size表示它包含的元素的數(shù)量。

有個(gè)關(guān)鍵字需要解釋:transient。

Java的serialization提供了一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)持久化對(duì)象時(shí),可能有一個(gè)特殊的對(duì)象數(shù)據(jù)成員,我們不想用serialization機(jī)制來(lái)保存它。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉serialization,可以在這個(gè)域前加上關(guān)鍵字transient。

經(jīng)常在實(shí)現(xiàn)了 Serializable接口的類中能看見(jiàn)transient關(guān)鍵字。這個(gè)關(guān)鍵字并不常見(jiàn)。 transient關(guān)鍵字的作用是:阻止實(shí)例中那些用此關(guān)鍵字聲明的變量持久化;當(dāng)對(duì)象被反序列化時(shí)(從源文件讀取字節(jié)序列進(jìn)行重構(gòu)),這樣的實(shí)例變量值不會(huì)被持久化和恢復(fù)。當(dāng)某些變量不想被序列化,同是又不適合使用static關(guān)鍵字聲明,那么此時(shí)就需要用transient關(guān)鍵字來(lái)聲明該變量。

除了以上兩個(gè)成員變量,我們還需要掌握一個(gè)變量,它是

protected transient int modCount = 0; 

這個(gè)變量主要作用是防止在進(jìn)行一些操作時(shí),改變了ArrayList的大小,那將使得結(jié)果不可預(yù)測(cè)。

構(gòu)造函數(shù):

/**無(wú)參構(gòu)造:
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**有參構(gòu)造
 * Constructs an empty list with the specified initial capacity.
 *
 * @paraminitialCapacitythe initial capacity of the list
 * @throws IllegalArgumentException if the specified initial capacity
 * is negative
 */
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);}
}
/**參數(shù)為集合的有參構(gòu)造
 * Constructs a list containing the elements of the specified
 * collection, in the order they are returned by the collection's
 * iterator.
 *
 * @param c the collection whose elements are to be placed into this list
 * @throws NullPointerException if the specified collection is null
 */
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 {// replace with empty array.this.elementData = EMPTY_ELEMENTDATA;}
} 

常用的方法

boolean add(E e) 
將指定的元素添加到此列表的尾部。
void add(int index, E element) 
將指定的元素插入此列表中的指定位置
boolean addAll(Collection<? extends E> c) 
按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。 
boolean addAll(int index, Collection<? extends E> c) 
從指定的位置開始,將指定 collection 中的所有元素插入到此列表中。 
void clear() 
移除此列表中的所有元素。 
Object clone() 
返回此 ArrayList 實(shí)例的淺表副本。 
boolean contains(Object o) 
如果此列表中包含指定的元素,則返回 true。 
void ensureCapacity(int minCapacity) 
如有必要,增加此 ArrayList 實(shí)例的容量,以確保它至少能夠容納最小容量參數(shù)所指定的元素?cái)?shù)。 
E get(int index) 
返回此列表中指定位置上的元素。 
int indexOf(Object o) 
返回此列表中首次出現(xiàn)的指定元素的索引,或如果此列表不包含元素,則返回 -1。 
boolean isEmpty() 
如果此列表中沒(méi)有元素,則返回 true 
int lastIndexOf(Object o) 
返回此列表中最后一次出現(xiàn)的指定元素的索引,或如果此列表不包含索引,則返回 -1。 
E remove(int index) 
移除此列表中指定位置上的元素。 
boolean remove(Object o) 
移除此列表中首次出現(xiàn)的指定元素(如果存在)。 
protected void removeRange(int fromIndex, int toIndex) 
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。 
E set(int index, E element) 
用指定的元素替代此列表中指定位置上的元素。 
int size() 
返回此列表中的元素?cái)?shù)。 
Object[] toArray() 
按適當(dāng)順序(從第一個(gè)到最后一個(gè)元素)返回包含此列表中所有元素的數(shù)組。
void trimToSize() 
將此 ArrayList 實(shí)例的容量調(diào)整為列表的當(dāng)前大小。應(yīng)用程序可以使用此操作來(lái)最小化 ArrayList 實(shí)例的存儲(chǔ)量。 

遍歷方式:ArrayList支持3種遍歷方式1.通過(guò)迭代器遍歷。即通過(guò)Iterator去遍歷2.隨機(jī)訪問(wèn),通過(guò)索引值去遍歷,ArrayList實(shí)現(xiàn)了RandomAccess接口,它支持通過(guò)索引值去隨機(jī)訪問(wèn)元素3.for循環(huán)遍歷

遍歷ArrayList時(shí),使用隨機(jī)訪問(wèn)(即通過(guò)索引序號(hào)訪問(wèn))效率最高,而使用迭代器的效率相對(duì)較低。

到此這篇關(guān)于Java ArrayList深入源碼層分析的文章就介紹到這了,更多相關(guān)Java ArrayList內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring IOC中三種依賴注入方式

    spring IOC中三種依賴注入方式

    這篇文章主要介紹了spring IOC中三種依賴注入方式,Spring使用注入方式,為什么使用注入方式,這系列問(wèn)題實(shí)際歸結(jié)起來(lái)就是一句話,Spring的注入和IoC(本人關(guān)于IoC的闡述)反轉(zhuǎn)控制是一回事
    2021-08-08
  • mybatis-plus 查詢時(shí)排除字段方法的兩種方法

    mybatis-plus 查詢時(shí)排除字段方法的兩種方法

    我們?cè)陂_發(fā)應(yīng)用時(shí),在某些應(yīng)用場(chǎng)景下查詢有時(shí)需要排除某些字段,本文主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 詳細(xì)總結(jié)Java基礎(chǔ)類和包裝類

    詳細(xì)總結(jié)Java基礎(chǔ)類和包裝類

    近幾天一直在復(fù)習(xí)Java基礎(chǔ)知識(shí),今天就帶大家總結(jié)一下Java基礎(chǔ)類和包裝類,下文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Springboot整合Activiti操作詳解

    Springboot整合Activiti操作詳解

    這篇文章主要給大家詳細(xì)介紹了Springboot整合Activiti的操作流程,文中流程步驟和代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 深入淺出的學(xué)習(xí)Java ThreadLocal

    深入淺出的學(xué)習(xí)Java ThreadLocal

    本文會(huì)基于實(shí)際場(chǎng)景介紹ThreadLocal如何使用以及內(nèi)部實(shí)現(xiàn)機(jī)制。 具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java帶復(fù)選框的樹(Java CheckBox Tree)實(shí)現(xiàn)和應(yīng)用

    Java帶復(fù)選框的樹(Java CheckBox Tree)實(shí)現(xiàn)和應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Java帶復(fù)選框的樹實(shí)現(xiàn)和應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java正則表達(dá)式匹配字符串并提取中間值的方法實(shí)例

    Java正則表達(dá)式匹配字符串并提取中間值的方法實(shí)例

    正則表達(dá)式常用于字符串處理、表單驗(yàn)證等場(chǎng)合,實(shí)用高效,下面這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式匹配字符串并提取中間值的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • java多線程Thread的實(shí)現(xiàn)方法代碼詳解

    java多線程Thread的實(shí)現(xiàn)方法代碼詳解

    這篇文章主要介紹了java多線程Thread的實(shí)現(xiàn)方法代碼詳解,涉及start(),run(),stop(),interrupt(),isInterrupted(),join()和join(long millis)等方法的介紹,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題詳解

    Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 詳解rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋

    詳解rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋

    這篇文章主要介紹了rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論