import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* 集合框架:Iterator
*Iterator(迭代器)用於遍歷集合元素,獲取迭代器可以使用Collection定義的方法:-Iterator iterator()
*迭代器Iterator是一個接口,集合在重寫Collection的iterator()方法時利用內部類提供了迭代器的實現
*Iterator提供了統一的遍歷集合元素的方式,其提供了用於遍歷集合的方法(一般結合while()使用):
*boolean hasNext():判斷集合是否還有元素可以遍歷
*E next():返回迭代的下一個元素
*Object next():返回迭代器剛越過的元素的引用,返回值是Object,需要強制轉換成自己需要的類型
* void remove():刪除迭代器剛越過的元素
*
* Iterator有一個很大的優點,就是我們不必知道集合的內部結果,集合的內部結構、狀態由Iterator來維持,
* 通過統一的方法hasNext()、next()來判斷、獲取下一個元素,
*/
public class IteratorDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("大哥");
c.add("二哥");
c.add("三哥");
Iterator ite=c.iterator();
while(ite.hasNext()) {
Object obj=ite.next();
System.out.println(obj);
}
System.out.println(c);
/**
* remove方法
* 在使用迭代器遍歷集合時,不能通過集合的remove方法刪除集合元素,否則會拋出併發更改異常
* 我們可以通過迭代器自身提供的remove()方法來刪除通過next()迭代出的元素
* 迭代器的刪除方法是在原集合中刪除元素
* 這裏需要注意:在調用remove方法前必須通過迭代器的next()方法迭代過元素
* 那麼刪除的就是這個元素。並且不能再次調用remove方法,除非再次調用next()後方可再次調用
*/
Iterator ite2=c.iterator();//必須寫
while(ite2.hasNext()) {
Object obj=ite2.next();
if("三哥".equals(obj)) {
ite2.remove();
}
System.out.println(obj);
}
System.out.println(c);
/**
* 增強型for循環
* 只作用於遍歷集合或數組
* 語法:
* for(元素類型 e:集合或數組) {
* 循環體
* }
* 新循環並非新的語法,而是在編譯過程中,編譯器會將新循環轉換爲迭代器模式,所以新循環本質是迭代器
*
*/
for(Object obj:c) {
System.out.println(obj);
}
/**
* 泛型
* 泛型本質是參數化類型
* <String>泛型<約束類型>
* <String>約束了c1集合中只能存儲String類型的數據,否則編譯出錯
*/
Collection<String> c1=new ArrayList<String>();
c1.add("a");
// c1.add(5);//編譯錯誤
/**
* List接口是Collection的子接口,用於定義線性表數據結構。
* 可以將List理解爲存放對象的數組,只不過其元素個數可以動態的增加或減少
* List是有序可重複的
*
* List接口的兩個常見實現類爲ArrayList和LinkedList,分別用動態數組和鏈表的方式實現了List接口
*
* 可以認爲ArrayList和LinkedList的方法在邏輯上完全一樣,
* 只是在性能上有一定的差別,ArrayList更適合於隨機訪問
* 而LinkedList更適合於插入和刪除。
*
* E get(int index)獲取集合中指定下標對應的元素,下標從0開始
* E set(int index,E elment)將給定的元素存入給定位置,並將原位置的元素返回
*/
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("a");
String str=list.get(0);
String str1=list.set(1, "PP");
System.out.println(str+"------"+str1);
System.out.println(list);
/**
* 遍歷:儘量使用Iterator\foreach
* ArrayList也可以利用get方法遍歷
*/
for(int i=0;i<list.size();i++) {
String val=list.get(i);
System.out.println(val);
}
/**
* void add(int index,E element):將給定的元素插入到指定位置,原位置及後續元素順序向後移動
* E remove(int index):刪除給定位置上的元素,將元素返回
*/
list.add(0, "K");//插入
System.out.println(list);
System.out.println(list.remove(0));//刪除
/**
* List的subList方法用於獲取子List
* subList獲取的List與原List佔有相同的存儲空間,對子List的操作會影響原List
* List<E> subList(int fromIndex,int toIndex)
* fromIndex和toIndex是截取子List的首尾下標(前包括,後不包括)
*/
List<Integer> list1=new ArrayList<Integer>();
for(int i=0;i<10;i++) {
list1.add(i);
}
System.out.println(list1);
List<Integer> subList=list1.subList(0, 4);//獲取子列表
System.out.println(subList);
subList.remove(0);//子List和原List佔有相同空間
System.out.println(subList);
System.out.println(list1);
/**
* List轉換爲數組
* List的toArray方法用於將集合轉換爲數組,但實際上該方法是在Collection中定義的,所以所有的集合都具備這個功能
* 其有兩個方法:
* Object[] toArray()
* <T>T[] toArray(T[] a):比較常用的,傳入一個指定類型的數組,該數組的元素類型應與集合的元素類型一致。返回值則是轉換後的數組,該數組會保存集合中所有的元素
*
*/
Collection<String> list2=new ArrayList<String>();
list2.add("kk");
list2.add("gg");
list2.add("jj");
list2.add("jj");
list2.add("yy");
String[] str2=new String[7];
//將數組str2的每個元素填充(fill)爲A
Arrays.fill(str2,"A");
//toString將數組中全部元素連接爲字符串
System.out.println(Arrays.toString(str2));//[A, A, A, A, A, A, A]
//調用toArray複製集合到數組,如果str2的長度等於或小於原集合元素數量,則返回新數組的引用
String[] out=list2.toArray(str2);
System.out.println(Arrays.toString(out));//[kk, gg, jj, jj, yy, null, A]
/**
* Arrays類中提供了一個靜態方法asList,使用該方法我們可以將一個數組轉換爲對應的List集合
*
*/
String[] arr={"tom","row","apple"};
List<String> list3=Arrays.asList(arr);
System.out.println(list3);
arr[0]="haohao";//修改數組內容,影響List
System.out.println(list3);
list3.set(0, "sanxing");//修改List,影響數組
System.out.println(Arrays.toString(arr));
// list3.add(0, "haha");//集合長度不能修改
}
}
java-Iterator(迭代器)遍歷集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.