最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java ArrayList深入源碼層分析

 更新時間:2023年01月17日 14:05:44   作者:做網安的小王  
Java中容器對象主要用來存儲其他對象,根據實現原理不同,主要有3類常用的容器對象:ArrayList使用數組結構存儲容器中的元素、LinkedList使用鏈表結構存儲容器中的元素

概述

ArrayList是基于數組實現的,是一個動態(tài)數組,其容量能自動增長,類似于C語言中的動態(tài)申請內存,動態(tài)增長內存。

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

ArrayList實現了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現了Cloneable接口,能被克隆。

每個ArrayList實例都有一個容量,該容量是指用來存儲列表元素的數組的大小。它總是至少等于列表的大小。隨著向ArrayList中不斷添加元素,其容量也自動增長。自動增長會帶來數據向新數組的重新拷貝,因此,如果可預知數據量的多少,可在構造ArrayList時指定其容量。在添加大量元素前,應用程序也可以使用ensureCapacity操作來增加ArrayList實例的容量,這可以減少遞增式再分配的數量。

注意,此實現不是同步的。如果多個線程同時訪問一個ArrayList實例,而其中至少一個線程從結構上修改了列表,那么它必須保持外部同步。

ArrayList繼承AbstractList,實現了List、 RandomAccess、Cloneable、Serializable接口, 為ArrayList內部是用一個數組存儲元素值,相當于一個大小可變的數組,也就是動態(tài)數組。 由于ArrayList底層是數組實現的,所以可以隨機訪問。

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

(1)繼承和實現繼承了AbstractList,實現了List:ArrayList是一個數組隊列,提供了相關的添加、刪除、修改、遍歷等功能。實現RandmoAccess接口:即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,為List提供快速訪問功能的在ArrayList中,我們即可以通過元素的序號快速獲取元素對象;這就是快速隨機訪問。實現了Cloneable接口:即覆蓋了函數clone(),能被克隆。實現java.io.Serializable接口:這意味著ArrayList支持序列化,能通過序列化去傳輸。

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

private static final int DEFAULT_CAPACITY = 10;//默認容量是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存儲ArrayList內的元素,size表示它包含的元素的數量。

有個關鍵字需要解釋:transient。

Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,我們不想用serialization機制來保存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。

經常在實現了 Serializable接口的類中能看見transient關鍵字。這個關鍵字并不常見。 transient關鍵字的作用是:阻止實例中那些用此關鍵字聲明的變量持久化;當對象被反序列化時(從源文件讀取字節(jié)序列進行重構),這樣的實例變量值不會被持久化和恢復。當某些變量不想被序列化,同是又不適合使用static關鍵字聲明,那么此時就需要用transient關鍵字來聲明該變量。

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

protected transient int modCount = 0; 

這個變量主要作用是防止在進行一些操作時,改變了ArrayList的大小,那將使得結果不可預測。

構造函數:

/**無參構造:
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**有參構造
 * 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);}
}
/**參數為集合的有參構造
 * 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 實例的淺表副本。 
boolean contains(Object o) 
如果此列表中包含指定的元素,則返回 true。 
void ensureCapacity(int minCapacity) 
如有必要,增加此 ArrayList 實例的容量,以確保它至少能夠容納最小容量參數所指定的元素數。 
E get(int index) 
返回此列表中指定位置上的元素。 
int indexOf(Object o) 
返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。 
boolean isEmpty() 
如果此列表中沒有元素,則返回 true 
int lastIndexOf(Object o) 
返回此列表中最后一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。 
E remove(int index) 
移除此列表中指定位置上的元素。 
boolean remove(Object o) 
移除此列表中首次出現的指定元素(如果存在)。 
protected void removeRange(int fromIndex, int toIndex) 
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。 
E set(int index, E element) 
用指定的元素替代此列表中指定位置上的元素。 
int size() 
返回此列表中的元素數。 
Object[] toArray() 
按適當順序(從第一個到最后一個元素)返回包含此列表中所有元素的數組。
void trimToSize() 
將此 ArrayList 實例的容量調整為列表的當前大小。應用程序可以使用此操作來最小化 ArrayList 實例的存儲量。 

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

遍歷ArrayList時,使用隨機訪問(即通過索引序號訪問)效率最高,而使用迭代器的效率相對較低。

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

相關文章

  • Java實現簡單GUI登錄和注冊界面

    Java實現簡單GUI登錄和注冊界面

    這篇文章主要為大家詳細介紹了Java實現簡單GUI登錄和注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 深入理解Java的Spring框架中的IOC容器

    深入理解Java的Spring框架中的IOC容器

    IOC(Inversion of Control,控制反轉)是Spring框架的核心,負責控制對象的生命周期與關系,接下來就讓我們跟隨文章來深入理解Java的Spring框架中的IOC容器:
    2016-07-07
  • rocketmq client 日志的問題處理方式

    rocketmq client 日志的問題處理方式

    這篇文章主要介紹了rocketmq client 日志的問題處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java控制結構知識點詳解

    Java控制結構知識點詳解

    在本篇文章里小編給大家分享的是關于Java控制結構知識點詳解,有需要的朋友們可以參考下。
    2019-10-10
  • SpringBoot后端解決跨域問題的3種方案分享

    SpringBoot后端解決跨域問題的3種方案分享

    這篇文章主要給大家分享介紹了關于SpringBoot后端解決跨域問題的3種方案,跨域指的是瀏覽器不能執(zhí)行其他網站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制,需要的朋友可以參考下
    2023-07-07
  • Java實現布隆過濾器的方法步驟

    Java實現布隆過濾器的方法步驟

    布隆過濾器是可以用于判斷一個元素是不是在一個集合里,并且相比于其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優(yōu)勢。下面這篇文章主要給大家介紹了關于Java實現布隆過濾器的相關資料,需要的朋友可以參考下
    2018-11-11
  • Java實現TopK問題的方法

    Java實現TopK問題的方法

    這篇文章主要介紹了Java實現TopK問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java 8函數式接口Function BiFunction DoubleFunction區(qū)別

    Java 8函數式接口Function BiFunction DoubleFunction

    這篇文章主要為大家介紹了Java 8函數式接口Function BiFunction DoubleFunction區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 關于mybatis-plus-generator的簡單使用示例詳解

    關于mybatis-plus-generator的簡單使用示例詳解

    在springboot項目中集成mybatis-plus是很方便開發(fā)的,最近看了一下plus的文檔,簡單用一下它的代碼生成器,接下來通過實例代碼講解關于mybatis-plus-generator的簡單使用,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 從JVM分析Java的類的加載和卸載機制

    從JVM分析Java的類的加載和卸載機制

    這篇文章主要介紹了從JVM分析Java的類的加載和卸載機制,講解了Java類的聲明周期,需要的朋友可以參考下
    2015-11-11

最新評論

山丹县| 乐东| 仁化县| 如皋市| 巴塘县| 买车| 延安市| 自治县| 昌吉市| 扶风县| 龙南县| 天全县| 格尔木市| 西峡县| 开封市| 德安县| 平果县| 岐山县| 集贤县| 满洲里市| 中卫市| 仁布县| 广饶县| 太仓市| 福建省| 达孜县| 四子王旗| 德清县| 沧源| 石首市| 民勤县| 阿坝| 华池县| 遵义县| 康乐县| 蕉岭县| 四平市| 陇南市| 赤城县| 临漳县| 兴山县|