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