JAVA 集合List迭代器及其子類

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);
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章