黑馬程序員-集合框架的List集合和迭代器

package it.heima.mylog;


/**
 * 

 * 知識點:集合框架Collection的子接口List集合


 * 對象是用來封裝特有數據的,對象一多了怎麼辦呢?用容器來存儲,每個容器內部都有自己的獨特點.
 * 把容器向上抽取,就形成了Collection集合框架.在Collection頂層接口下有兩個很常用的子接口List和Set,
 * 它們均在Collection的功能上各自加了自己特有的方法.
 * 
 * List接口
 * 
 * List接口有很多實現類,其中Vector,ArrayList,LinekList三種最爲多用,
 * 注意,它們都是實現類,只有List能對數元素進行添刪改查的功能.
 * Vector是在JDK1.0就出現了,屬於元老級別,其實內部的數據結構就是數組,同步的,處理數據能力效率很低.
 * ArrayList是在JDK1.2出現的,內部數據結構和Vector一樣數組結構,但不同步,出於安全性考慮適用於單線程.對元素的查找非常快.
 * LinekList內部數據是鏈表結構,線程不同步,對數據的添刪非常快.
 * 
 * 迭代器Iterator
 * 
 * 對象放在容器中,怎麼取出來呢?需要用到迭代器.迭代器也是一個接口,
 * 它是一種取出集合元素的一種方法.因爲每個容器的內部結構不同,取出元素的方法也不同,
 * 那麼對每種容器的迭代器進行向上抽取,就形成了一個Iterator接口。
 * 
 * Iterator接口有一個iterator方法,返回值爲Iterator類型,這樣就獲得了一個迭代器對象,就可以取元素啦.
 * 
 * 當對一個集合進行迭代時啊,同時對集合進行添加或刪除,這樣就會拋出異常,
 * 因爲對集合進行迭代時,其實迭代器已經獲取了集合的元素個數,
 * 如果在迭代的過程中再對集合進行增刪也就改變了集合元素的個數,迭代器會不知道的,
 * 這樣的程序就會不嚴謹,當然會拋異常。
 * 
 * 爲了避免這種現象而我又要偏要在迭代過程中對集合元素修列表改麼辦???
 * Iterator接口很爭氣,在Iterator接口下有一個子接口ListIterator系列表迭代器,它有效的避免了上述的情況,
 * 在對集合元素迭代過程中能對集合元素進行添刪改查.
 * 
 *---------------------------/


 /*練練手,來代碼爽爽:-P*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;


class CollList {


public static void main(String[] args) {


// showArrayList1();
// showArrayList2();
showLinkedList();
}


public static void showLinkedList() {
LinkedList<String> link = new LinkedList<String>();
link.add("abc1");// 添加元素
link.add("abc3");
link.add("abc1");
link.add("abc2");
Iterator<String> it = link.iterator();
while (it.hasNext()) {
// 在迭代器過程中,不要使用集合操作元素,容易出現異常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一個元素和第三個元素hashCode一樣
}


/**
* 使用LinkedList來模擬一個堆棧或者隊列數據結構 堆棧:先進後出 First In Last Out (FILO)
* 隊列:先進先出First In First Out (FIFO) 應該描述這樣一個容器,給使用提供一個容器對象完成這兩種結構中的一種。
* 思路: 構造一個容器,創建一個容器對象,給使用者提供一個容器對象操作 Queue inst = new Queue();
*/
Queue inst = new Queue();

/*先進先出,這是FIFO模式 */
inst.myAdd("z計劃1");
inst.myAdd("z計劃2");
inst.myAdd("z計劃3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}

/*先進後出,這是FILO模式*/
inst.myAdd2("z計劃1");
inst.myAdd2("z計劃2");
inst.myAdd2("z計劃3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}

System.out.println(link);
link.addFirst("zplan");
System.out.println(link);
/*addFirst是在元素的最前前面依次添加的 */


System.out.println("getFirst() = " + link.getFirst());
System.out.println(link);
/* getFirst()取出第一個元素,但不刪除。 */


System.out.println("removeFirst() = " + link.removeFirst());
System.out.println(link);
/* removeFirst()移除第一個元素。會刪除數據的。 */


System.out.println(link.isEmpty());
/* 當集合裏沒有元素的時候,返回true。否則返回false。 */


}


public static void showArrayList1() {
List<String> list = new ArrayList<String>();
list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");


Iterator<String> it = list.iterator();
while (it.hasNext()) {
// 在迭代器過程中,不要使用集合操作元素,容易出現異常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一個元素和第三個元素hashCode一樣
}
}


/* 可以使用Iterator接口的子接口ListIterator來完成在迭代中對元素進行更多的操作 */
public static void showArrayList2() {
List<String> list = new ArrayList<String>();


list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");
System.out.println("修改之前:" + list);
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) {
// 如果元素等於"abc2",就替換掉它
if (it2.next().equals("abc2")) {
it2.set("Z計劃");
}
/*
* if(it2.previous()== "abc2"){ System.out.println(list); }
*/
}
System.out.println("修改之後:" + list);// [abc1, abc3, abc1, Z計劃]
}
}


/************************ Queue類 ********************************************/
class Queue {
private LinkedList<String> link;


Queue() {
link = new LinkedList<String>();
}


public void myAdd(String str) {// FIFO模式
link.addLast(str);
}


public void myAdd2(String str) {// FILO模式
link.addFirst(str);
}


public Object myGet() {
return link.removeFirst();
}


public boolean isNull() {
return link.isEmpty();
}
}
發佈了30 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章