List中除了vector(1.0版本出現,後併入集合)全是非同步:效率高
Vector:底層數組,也自動增長縮短(100%延長),同步的(線程安全,效率低)。所以幾乎不用,增刪查都很慢,垃圾。
ArrayList:底層數組,50%延長,不同步(線程不安全,但效率高),查詢快。
LinkedList:底層鏈表,不同步,增刪很快,也有角標(Link集合的特點)。
爲什麼數組查詢比鏈表快?ArrayLlsit內存空間連續查找快。LinkedList不連續查找慢。
除了哈希結構,remove()和contains()方法都是用equals()來判斷字面值來進行刪除和判斷包含。哈希結構的集合
必須根據hashcode()和equals()方法一起判斷。
//基本數據類型賦給引用類型變量時才自動裝箱;引用數據類型和基本數據類型做運算時自動拆箱
public static void main(String[] args)
{
/*listIterator與Iterator區別:
*listIterator包含衆多方法(向前,向後,增刪查改)
*Iterator包含(next、hasNext、remove。其中使用remove可以維護一致性,不會產生異常*/
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
ListIterator iter = list.listIterator();
// Iterator iter = list.iterator(); Wrong
while(iter.hasNext()) {
Object obj = iter.next();
if(obj.equals("abc2")) {
//list.add("abc9");這裏會報併發異常。當加入此元素時,迭代器並不知道,迭代時不確定的。集合和迭代不能同時操作同一對象
//修改:使用ListIterator迭代器對象來在迭代過程中修改數據。
iter.add("abc4");
//iter.remove() OK;
}
/*Iterator是工作在一個獨立的線程中,並且擁有一個mutex鎖,
Iterator 被創建之後會建立一個指向原來對象的單鏈索引表,
當原來的list對象數量發生變化時,這個索引表的內容不會同步改變,
所以當索引指針往後移動的時候就找不到要迭代的對象,所以按照
fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。如果併發操作,需要對 Iterator 對象加鎖。*/
}
System.out.println("next:"+list);
}