06迭代器的概述
A:迭代器概述:
a:java中提供了很多個(gè)集合,它們?cè)诖鎯?chǔ)元素時(shí),采用的存儲(chǔ)方式不同。
我們要取出這些集合中的元素,可通過(guò)一種通用的獲取方式來(lái)完成。
b:Collection集合元素的通用獲取方式:在取元素之前先要判斷集合中有沒(méi)有元素,
如果有,就把這個(gè)元素取出來(lái),繼續(xù)在判斷,如果還有就再取出出來(lái)。一直把集合中的所有元素全部取出。這種取出方式專業(yè)術(shù)語(yǔ)稱為迭代。
c:每種集合的底層的數(shù)據(jù)結(jié)構(gòu)不同,例如ArrayList是數(shù)組,LinkedList底層是鏈表,但是無(wú)論使用那種集合,我們都會(huì)有判斷是否有元素
以及取出里面的元素的動(dòng)作,那么Java為我們提供一個(gè)迭代器定義了統(tǒng)一的判斷元素和取元素的方法
07迭代器的實(shí)現(xiàn)原理
A:迭代器的實(shí)現(xiàn)原理
/
* 集合中的迭代器:
* 獲取集合中元素方式
* 接口 Iterator : 兩個(gè)抽象方法
* boolean hasNext() 判斷集合中還有沒(méi)有可以被取出的元素,如果有返回true
* next() 取出集合中的下一個(gè)元素
*
* Iterator接口,找實(shí)現(xiàn)類.
* Collection接口定義方法
* Iterator iterator()
* ArrayList 重寫方法 iterator(),返回了Iterator接口的實(shí)現(xiàn)類的對(duì)象
* 使用ArrayList集合的對(duì)象
* Iterator it =array.iterator(),運(yùn)行結(jié)果就是Iterator接口的實(shí)現(xiàn)類的對(duì)象
* it是接口的實(shí)現(xiàn)類對(duì)象,調(diào)用方法 hasNext 和 next 集合元素迭代
*/
08迭代器的代碼實(shí)現(xiàn)
*A:迭代器的代碼實(shí)現(xiàn)
public class IteratorDemo {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
//迭代器,對(duì)集合ArrayList中的元素進(jìn)行取出
//調(diào)用集合的方法iterator()獲取出,Iterator接口的實(shí)現(xiàn)類的對(duì)象
Iterator<String> it = coll.iterator();
//接口實(shí)現(xiàn)類對(duì)象,調(diào)用方法hasNext()判斷集合中是否有元素
//boolean b = it.hasNext();
//System.out.println(b);
//接口的實(shí)現(xiàn)類對(duì)象,調(diào)用方法next()取出集合中的元素
//String s = it.next();
//System.out.println(s);
//迭代是反復(fù)內(nèi)容,使用循環(huán)實(shí)現(xiàn),循環(huán)的條件,集合中沒(méi)元素, hasNext()返回了false
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
09迭代器的執(zhí)行過(guò)程
A:迭代器的執(zhí)行過(guò)程
a:迭代器的原理:
while(it.hasNext()) {
System.out.println(it.next());
}
//cursor記錄的索引值不等于集合的長(zhǎng)度返回true,否則返回false
public boolean hasNext() {
return cursor != size; //cursor初值為0
}
//next()方法作用:
//①返回cursor指向的當(dāng)前元素
//②cursor++
public Object next() {
int i = cursor;
cursor = i + 1;
return elementData[lastRet = i];
}
b:for循環(huán)迭代寫法:
for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) {
System.out.println(it2.next());
}
10集合迭代中的轉(zhuǎn)型
A:集合迭代中的轉(zhuǎn)型
a:在使用集合時(shí),我們需要注意以下幾點(diǎn):
? 集合中存儲(chǔ)其實(shí)都是對(duì)象的地址。
? 集合中可以存儲(chǔ)基本數(shù)值嗎?jdk1.5版本以后可以存儲(chǔ)了。
因?yàn)槌霈F(xiàn)了基本類型包裝類,它提供了自動(dòng)裝箱操作(基本類型?對(duì)象),這樣,集合中的元素就是基本數(shù)值的包裝類對(duì)象。
b:存儲(chǔ)時(shí)提升了Object。取出時(shí)要使用元素的特有內(nèi)容,必須向下轉(zhuǎn)型。
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
//由于元素被存放進(jìn)集合后全部被提升為Object類型
//當(dāng)需要使用子類對(duì)象特有方法時(shí),需要向下轉(zhuǎn)型
String str = (String) it.next();
System.out.println(str.length());
}
注意:如果集合中存放的是多個(gè)對(duì)象,這時(shí)進(jìn)行向下轉(zhuǎn)型會(huì)發(fā)生類型轉(zhuǎn)換異常。
c:Iterator接口也可以使用<>來(lái)控制迭代元素的類型的。代碼演示如下:
Collection<String> coll = new ArrayList<String>();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator<String> it = coll.iterator();
while (it.hasNext()) {
String str = it.next();
//當(dāng)使用Iterator<String>控制元素類型后,就不需要強(qiáng)轉(zhuǎn)了。獲取到的元素直接就是String類型
System.out.println(str.length());
}