ArrayList 算是我們開發中最經常用到的一個集合了,使用起來很方便,對於內部元素的隨機存取很快。今天來分析下ArrayList的一些原理方法,對於平常工作和麵試都是非常有用的。
另外本人整理收藏了20年多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大家,我認為對面試來說是非常有用的,想要資料的話請點795983544 暗號CSDN。
ArrayList 是一個陣列佇列,相當於 動態陣列。與 Java 中的陣列相比,它的容量能動態增長。它繼承於 AbstractList,實現了 List, RandomAccess, Cloneable, java.io.Serializable 這些介面。 看過 ArrayList 原始碼的同學有沒有注意過有這麼一個細節:為什麼 ArrayList 實現了RandomAccess這個介面,但是 LinkedList 卻沒有實現這個介面?這是一個空介面,裡面沒有任何的方法,有什麼作用呢?
答案: RandomAccess 是一個標誌介面,表明實現這個這個介面的 List 集合是支援快速隨機存取的。也就是說,實現了這個介面的集合是支援 快速隨機存取 策略的。而 LinkedList 是不能實現隨機存取的。
ArrayList 包含了兩個重要的物件:elementData 和 size。
那是不是有人就會問既然 ArrayList 本質是陣列,那為啥它的長度可以改變?
首先,陣列的確長度不能改變。不過,ArrayList 內部有一系列騷操作,大概就是它每次覺得長度不夠就會 建立一個新陣列,這個新陣列的容量比原來多出 50%,把原來的陣列 copy 過來,然後把以前的陣列銷燬掉。
// 隨機存取
List<String> list = new ArrayList<>();
int size = list.size();
for (int i = 0; i < size; i++) {
value = list.get(i);
}
// 迭代器遍歷
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
value = iter.next();
}
// 增強 for 迴圈
for (String s : list) {
value = s;
}
list.forEach(p -> {
p.hashCode();
});
四種遍歷比較
雖然有四種遍歷方式,但是能夠正確刪除資料的方式只有兩種
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
iter.next().hashCode();
iter.remove();
}
for(int i = list.size()-1;i>=0;i--){
list.remove(i);
}
下面再演示下錯誤的刪除操作
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
for(int i=0;i<list.size();i++){
list.remove(i);
}
System.out.println(String.join(",",list));
結果輸出:1
謹慎使用 ArrayList 中的 subList 方法
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
ArrayList<String> strings = (ArrayList)list.subList(0, 1);
執行結果:
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList
at com.workit.demo.listener.ArrayListTest.main(ArrayListTest.java:29)
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
List<String> subList = list.subList(0, 1);
// 對原 List 增加一個值
list.add("10");
subList.add("11"); // 這一行會報 java.util.ConcurrentModificationException
另外本人整理收藏了20年多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大家,我認為對面試來說是非常有用的,想要資料的話請點795983544 暗號CSDN。