Java集合——ArrayList
一直要總結java集合中的知識,不知道應該如何下筆。覺得集合太多東西了,寫細了太難了,寫粗了又感覺寫不好。不管如何覺得還是要堅持的寫一寫基礎這一類的東西,為了提高自己的編程基礎。本來覺的自己對這些已經很熟悉,最近見過一些大神後發現差距太大了,瞬間懵了,只能在加強學習了。
一、ArrayList是什麼?
ArrayList是實現List介面的動態數組,所謂動態是指它的大小是可變的。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 介面外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。
既然是數組,肯定就有容量。每個ArrayList對象都有一個容量,該容量是用來表示可以存放多少個數據在裡面,即是數組的大小(默認是10)。當然,動態的肯定就會自動增加,每次我們往裡面添加數據的時候,它都會進行擴容檢查,檢查完擴容會擴大為原來的1.5倍,擴容操作帶來數據向新數組的重新拷貝,影響性能,所以如果我們知道具體業務數據量,在構造ArrayList時可以給ArrayList指定一個初始容量,這樣就會減少擴容時數據的拷貝問題。當然在添加大量元素前,應用程序也可以使用ensureCapacity操作來增加ArrayList實例的容量,這可以減少遞增式再分配的數量。
ArrayList的底層實現是不同步,多線程操作會出現問題,這一點大家要注意。可以插入重複數據,可以插入Null。
二、ArrayList源碼分析
2.1、ArrayList定義
ArrayList的定義,繼承AbstractList,實現List
2.2、底層使用數組
private static final long serialVersionUID = 8683452581122892189L;//serialVersionUID作用是序列化時保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。
private transient Object[] elementData;//Object數組,transient關鍵字不知道的同學自己查資料去,帶transient關鍵字的變數不會序列化。ArrayList容器,基本操作都是基於該數組進行操作的。
private int size;//數組的大小。
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//要分配的數組的最大大小。
2.3、構造函數
ArrayList有三個構造函數:
ArrayList():默認構造函數,提供初始容量為10的空列表。
ArrayList(int initialCapacity):構造一個具有指定初始容量的空列表。
ArrayList(Collection extends E> c):構造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。
2.4、add方法
ArrayList提供了add(E e)、add(int index, E element)、addAll(Collection extends E> c)、addAll(int index, Collection extends E> c)、set(int index, E element)這個五個方法來實現ArrayList增加。
我就拿一個來講了,懂的一個,其他應該都懂了。
2.5、remove方法
ArrayList提供了remove(int index)、remove(Object o)、removeRange(int fromIndex, int toIndex)、removeAll()四個方法進行元素的刪除。
remove(int index):移除此列表中指定位置上的元素。
remove(Object o):如果存在移除此列表中首次出現的指定元素。
2.6、get方法
2.7、注意subList方法
上面一段代碼我感覺大部人都會認為結果是2個false,list2是新構造的肯定與list1不一樣,list3是截取的肯定也不一樣。所以會認為都是false,我們深入subList去看看。
原來sublist裡面操作的是原來的list,並沒有生成新的list,導致2個其實是一樣的。
所以上面正確的結果是:
list1 == list2:false
list1 == list3:true
三、ArrayList總結
因為它是基於數組實現的,主要有如下特點:
1、插入、刪除比較慢,因為插入、刪除需要移動數據位置。
2、可以重複插入數據、可以插入null。
3、查找比較快,可以直接使用下標。
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!
※Java知識點路線圖整理
※淺談Java內存分配和回收策略
※程序員,感覺技術停滯了怎麼辦?
※深入分析Java的String類的方法與特點
※Java對於內存的需要知道的知識
TAG:Java團長 |