泛型数组列表ArrayList
【0】README
0.1) 本文描述+源代碼均 轉(zhuǎn)自 core java volume 1, 旨在理清 java 中的 數(shù)組列表 ArrayList;
【2】數(shù)組列表 ArrayList
2.1)ArrayList: ArrayList 具有自動調(diào)節(jié)數(shù)組容量的功能, 而不需要為此編寫任何代碼;
2.2)ArrayList 是一個采用類型參數(shù)的泛型類:
Annotation)實現(xiàn)動態(tài)數(shù)組, ArrayList 比 Vector 更加有效;
2.3)數(shù)組列表管理著 對象引用的一個內(nèi)部數(shù)組:最終,數(shù)組的全部空間有可能被用盡, 這就顯現(xiàn)出數(shù)組列表的操作魅力:如果 調(diào)用add 且 內(nèi)部數(shù)組已經(jīng)滿了,數(shù)組列表就將自動地創(chuàng)建一個更大的數(shù)組,并將所有的對象從較小的數(shù)組中拷貝到較大的數(shù)組中;
2.4)ensureCapacity方法——如果已經(jīng)清楚或能夠估計出數(shù)組可能存儲的元素數(shù)量, 就可以在填充數(shù)組之前調(diào)用 ensureCapacity方法: staff.ensureCapacity(100); 這個方法將分配一個包含100個對象的內(nèi)部數(shù)組, 然后調(diào)用100 次add, 而不用重新分配空間了;還可以把初始容量傳給 ArrayList 構(gòu)造器: ArrayList staff= new ArrayList<>(100);
Alert) 數(shù)組列表的容量和數(shù)組大小是有區(qū)別的:如果為數(shù)組分配100個元素, 數(shù)組就有100個空位置可以使用; 而容量為100的數(shù)組列表只是擁有保存100個元素的潛力(實際上, 重新分配空間的話, 將會超過100);
2.5)size方法:它返回數(shù)組列表的實際元素數(shù)目, 等價于數(shù)組的 length 方法;
2.6)trimToSize方法:一旦能夠確認數(shù)組列表的大小不在發(fā)生變化,就可調(diào)用 trimToSize 方法, 這個方法將存儲區(qū)域的大小調(diào)整為當前元素數(shù)量所需要的存儲空間數(shù)組。垃圾回收器將回收多余的存儲空間;
Attention) 一旦整理了數(shù)組列表的大小,添加新元素就需要花時間再次移動存儲塊, 所以應(yīng)該在確認不會添加任何元素時, 再調(diào)用 trimToSize 方法;
【3】訪問數(shù)組列表元素
3.1)擴展數(shù)組的一個技巧:既可以靈活地擴展數(shù)組, 又可以方便地訪問數(shù)組元素
- 1) 先創(chuàng)建一個數(shù)組, 并添加所有元素:ArrayList list = new ArrayList<>();
2) 使用 toArray 方法將數(shù)組元素拷貝到一個數(shù)組中:
X[] a = new X[list.size()]; list.toArray(a);
3.2)在數(shù)組中間插入元素 + 刪除元素
int n = staff.size/2; staff.add(n, e); //位于n 之后的所有元素都要向后移動一個位置, 數(shù)組大小減1; Employee e = staff.remove(n); //位于n 之后的所有元素都要向前移動一個位置, 數(shù)組大小加1;3.3)對數(shù)組進行插入和刪除的效率比較低
如果數(shù)組存儲的元素比較多的話, 又經(jīng)常需要在中間位置插入、刪除元素, 就應(yīng)該考慮使用鏈表了;
Attention)將 Employee[] 數(shù)組替換成 ArrayList , 請注意一下變化:
- A1)不必指出數(shù)組的大小;
- A2)使用 add 將任意多的元素添加到數(shù)組中;
- A3)使用 size() 替代 length 計算元素數(shù)目;
- A4)使用 a.get(i) 替代 a[i] 訪問元素;
【4】類型化與原始數(shù)組列表的兼容性
4.1)假設(shè)有下面這些遺留下來的類:
public class EmployeeDB {public void update(ArrayList list) {...}public ArrayList find(String query) {...} } ArrayList<Employee> staff = ...; employeeDB.update(staff);Warning)
- W1)這樣調(diào)用不太安全,因為添加到 數(shù)組列表中的元素可能不是 Employee 類型;
- W2)相反, 將一個原始ArrayList 賦給一個類型化ArrayList ,會得到一個警告;
ArrayList result = employeeDB.find(query); W3)使用類型轉(zhuǎn)換,還不能避免出現(xiàn)警告:
ArrayList<Employee> result = ( ArrayList<Employee> )employeeDB.find(query); 而且,還會得到 另外一個警告消息, 被告之 類型轉(zhuǎn)換有誤;
4.2)鑒于兼容性的考慮: 編譯器在對類型轉(zhuǎn)換進行檢查之后, 如果沒有發(fā)現(xiàn)違反規(guī)則的現(xiàn)象, 就將所有的類型化數(shù)組列表轉(zhuǎn)換成原始 ArrayList對象。在程序運行時, 所有的數(shù)組列表都一樣, 即沒有虛擬機中的類型參數(shù);因此, 類型轉(zhuǎn)換(ArrayList) 和 (ArrayList) 將進行相同的運行時檢查;
- 1)在這種情形下,不必做什么:只要研究一下編譯器的警告性提示,并確保這些警告不會造成太嚴重的后果就行了;
2)一旦確保不會造成嚴重的后果: 就可以使用 @SuppressWarnings(“unchecked”) 標注來標記這個變量能夠接受類型轉(zhuǎn)換, 如下所示:
@SuppressWarnings("unchecked") ArrayList<Employee> result = (ArrayList<Employee>) employeeDB.find(query);
總結(jié)
以上是生活随笔為你收集整理的泛型数组列表ArrayList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java重载与重写的区别+重写父类equ
- 下一篇: 脑细胞源自海中的扁形动物?科学家发现 8