Enumeration與Iterator介紹

Enumeration

Enumeration簡(jiǎn)介

???????Enumeration(列舉)仁卷,本身是一個(gè)接口,不是一個(gè)類犬第。Enumeration接口本身不是一個(gè)數(shù)據(jù)結(jié)構(gòu)锦积。但是,對(duì)其他數(shù)據(jù)結(jié)構(gòu)非常重要歉嗓。 Enumeration接口定義了從一個(gè)數(shù)據(jù)結(jié)構(gòu)得到連續(xù)數(shù)據(jù)的手段丰介。實(shí)現(xiàn) Enumeration 接口的對(duì)象,它生成一系列元素,一次生成一個(gè)哮幢。連續(xù)調(diào)用 nextElement 方法將返回一系列的連續(xù)元素带膀。

???????例如,要輸出 Vector<E> v的所有元素橙垢,可使用以下方法:

 for (Enumeration<E> e = v.elements(); e.hasMoreElements();){
     System.out.println(e.nextElement());
 }

Enumeration 方法介紹

???????Enumeration接口提供了一套標(biāo)準(zhǔn)的方法垛叨,主要通過(guò)向量的元素、哈希表的鍵以及哈希表中的值進(jìn)行枚舉柜某。由于Enumeration是一個(gè)接口嗽元,它的角色局限于為數(shù)據(jù)結(jié)構(gòu)提供方法協(xié)議,實(shí)現(xiàn)該接口的對(duì)象由一系列的元素組成,可以連續(xù)地調(diào)用nextElement()方法來(lái)得到 Enumeration枚舉對(duì)象中的元素喂击。Enumertion接口中僅定義了下面兩個(gè)方法剂癌。

  1. boolean hasMoreElements()

測(cè)試此枚舉是否包含更多的元素。

返回值:當(dāng)且僅當(dāng)此枚舉對(duì)象至少還包含一個(gè)可提供的元素時(shí)翰绊,才返回 true佩谷;否則返回 false。

  1. E nextElement()

    如果此枚舉對(duì)象至少還有一個(gè)可提供的元素监嗜,則返回此枚舉的下一個(gè)元素谐檀。

    返回值:此枚舉的下一個(gè)元素。

    拋出:NoSuchElementException - 如果沒(méi)有更多的元素存在裁奇。

Enumeration代碼舉例

  1. 使用Enumeration遍歷Vector集合
  import java.util.Enumeration;
  import java.util.Vector;  
  
  public class EnumerationTest {
        public static void main(String[] args) {
        
            Vector<String> vector = new Vector<String>();
            vector.addElement("Monday");
            vector.addElement("Tuesday");
            vector.addElement("Wednesday");
            vector.addElement("Thursday");
            
            Enumeration<String> elements = vector.elements();
            while (elements.hasMoreElements()) {
                System.out.println(elements.nextElement());
            }
        }
}

輸出的結(jié)果為:

Monday
Tuesday
Wednesday
Thursday
  1. 使用Enumeration遍歷HashTable(使用枚舉獲取key的值)
   import java.util.Enumeration;
   import java.util.Hashtable;  
     
   public class EnumerationTest {
       public static void main(String[] args) {

            Hashtable<String, String> table = new Hashtable<String, String>();
            table.put("星期一", "Monday");
            table.put("星期二", "Tuesday");
            table.put("星期三", "Wednesday");
            table.put("星期四", "Thursday");
            
            Enumeration<String> keys = table.keys();
            while (keys.hasMoreElements()) {
                String element= keys.nextElement();
                System.out.println(element);
            }
        }
    }

輸出的結(jié)果為:

星期三
星期二
星期四
星期一
  1. 使用Enumeration遍歷HashTable(使用枚舉獲取value值)
   import java.util.Enumeration;
   import java.util.Hashtable;  
     
   public class EnumerationTest {
       public static void main(String[] args) {

            Hashtable<String, String> table = new Hashtable<String, String>();
            table.put("星期一", "Monday");
            table.put("星期二", "Tuesday");
            table.put("星期三", "Wednesday");
            table.put("星期四", "Thursday");
            
            Enumeration<String> values= table.elements();
            while (values.hasMoreElements()) {
                String element= values.nextElement();
                System.out.println(element);
            }
        }
    }

輸出的結(jié)果為:

Wednesday
Tuesday
Thursday
Monday

Iterator

Iterator簡(jiǎn)介

???????Iterator(迭代器)取代了 Java Collections Framework(Java集合框架) 中的 Enumeration稚补,迭代器與枚舉有兩點(diǎn)不同:

  • 迭代器允許調(diào)用者利用定義良好的語(yǔ)義在迭代期間從迭代器所指向的collection 移除元素。

  • 方法名稱得到了改進(jìn)框喳。

Iterator方法介紹:

  1. boolean hasNext()

如果仍有元素可以迭代,則返回 true厦坛。(換句話說(shuō)五垮,如果 next 返回了元素而不是拋出異常,則返回 true)杜秸。

返回值:如果迭代器具有多個(gè)元素放仗,則返回 true。
  1. E next()

    返回迭代的下一個(gè)元素撬碟。

    返回值:迭代的下一個(gè)元素诞挨。

    拋出:NoSuchElementException - 沒(méi)有元素可以迭代。

  1. void remove()

從迭代器指向的 collection 中移除迭代器返回的最后一個(gè)元素(可選操作)呢蛤。每次調(diào)用 next 只能調(diào)用一次此方法惶傻。如果進(jìn)行迭代時(shí)用調(diào)用此方法之外的其他方式修改了該迭代器所指向的 collection,則迭代器的行為是不確定的其障。

拋出:

  • UnsupportedOperationException - 如果迭代器不支持 remove 操作银室。
  • IllegalStateException - 如果尚未調(diào)用 next 方法,或者在上一次調(diào)用 next 方法之后已經(jīng)調(diào)用了 remove 方法。

Iterator代碼舉例

?????? 這里使用Iterator遍歷list單列集合蜈敢,對(duì)于map多列集合辜荠,在調(diào)用keySet()方法或者是entrySet()方法之后同樣也是相當(dāng)于單列集合了。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

輸出結(jié)果為:

Monday
Tuesday
Wednesday

調(diào)用Iterator的remove()方法:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("Wednesday".equals(iterator.next())) {
                iterator.remove();
            }
            System.out.println(list);
        }
    }
}

輸出的結(jié)果:

[Monday, Tuesday, Wednesday]
[Monday, Tuesday, Wednesday]
[Monday, Tuesday]

注意:每次循環(huán)中最好只使用一次next()方法抓狭,因?yàn)槭褂靡淮尾。羔樉蜁?huì)往下走一個(gè),如果在一個(gè)循環(huán)中使用了兩次next()方法否过,可能會(huì)出現(xiàn)NoSuchElementException 的異常午笛,例如:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() != null && !"".equals(iterator.next())) {
                // 邏輯處理
            }
        }
    }
}

上面代碼,循環(huán)一次叠纹,指針向后移動(dòng)兩位季研,這樣在第二次循環(huán)時(shí),第二個(gè)iterator.next()會(huì)拋異常誉察。

同樣需要注意remove()方法与涡,每次調(diào)用只能夠在調(diào)用了next()方法的前提下才可以移除響應(yīng)元素。如果調(diào)用了多個(gè)next()方法后再調(diào)用remove()方法持偏,則移除的時(shí)最后一次調(diào)用next()方法返回的元素驼卖。例如:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        list.add("Thursday");
        
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() != null && !"".equals(iterator.next())) {
                iterator.remove();
            }
            System.out.println(list);
        }
    }
}

輸出的結(jié)果為:

[Monday, Wednesday, Thursday]
[Monday, Wednesday]

總結(jié)

Enumeration接口是JDK1.0時(shí)推出的,在JDK1.5之后為Enumeration接口進(jìn)行了擴(kuò)充鸿秆,增加了泛型的操作應(yīng)用酌畜。Iterator迭代器取代了 Enumeration的功能,同時(shí)增添了刪除元素的方法卿叽,并且對(duì)方法的名稱進(jìn)行了改進(jìn)桥胞。為什么還要使用Enumeration?這是因?yàn)閖ava的發(fā)展經(jīng)歷了很長(zhǎng)時(shí)間考婴,一些比較古老的系統(tǒng)或者類庫(kù)中的方法還在使用Enumeration接口贩虾,因此為了兼容,還是需要使用Enumeration沥阱。已知的對(duì)于vactor和hashtable的遍歷還可能會(huì)使用Enumeration缎罢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市考杉,隨后出現(xiàn)的幾起案子策精,更是在濱河造成了極大的恐慌,老刑警劉巖崇棠,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽袜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡易茬,警方通過(guò)查閱死者的電腦和手機(jī)酬蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門及老,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人范抓,你說(shuō)我怎么就攤上這事骄恶。” “怎么了匕垫?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵僧鲁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我象泵,道長(zhǎng)寞秃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任偶惠,我火速辦了婚禮春寿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忽孽。我一直安慰自己绑改,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布兄一。 她就那樣靜靜地躺著厘线,像睡著了一般。 火紅的嫁衣襯著肌膚如雪出革。 梳的紋絲不亂的頭發(fā)上造壮,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音骂束,去河邊找鬼耳璧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛展箱,可吹牛的內(nèi)容都是我干的楞抡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼析藕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凳厢?” 一聲冷哼從身側(cè)響起账胧,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎先紫,沒(méi)想到半個(gè)月后治泥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遮精,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年居夹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了败潦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡准脂,死狀恐怖劫扒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狸膏,我是刑警寧澤沟饥,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站湾戳,受9級(jí)特大地震影響贤旷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砾脑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一幼驶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韧衣,春花似錦盅藻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至夸政,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榴徐,已是汗流浹背守问。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坑资,地道東北人耗帕。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袱贮,于是被迫代替她去往敵國(guó)和親仿便。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個(gè)實(shí)際應(yīng)用:整合工資表數(shù)據(jù)攒巍。 這個(gè)項(xiàng)目的背景是這樣的嗽仪,項(xiàng)目...
    七寸知架構(gòu)閱讀 2,550評(píng)論 0 53
  • 1.Java集合框架是什么?說(shuō)出一些集合框架的優(yōu)點(diǎn)柒莉? 每種編程語(yǔ)言中都有集合闻坚,最初的Java版本包含幾種集合類:V...
    joshul閱讀 373評(píng)論 0 2
  • Collection接口 Collection接口是所有集合的祖先類。他有兩個(gè)構(gòu)造方法兢孝,一個(gè)無(wú)參構(gòu)造窿凤,一個(gè)是帶Co...
    夜幕繁華閱讀 593評(píng)論 0 0
  • 生活是杯苦的黑咖啡, 能把它喝淡的, 喝香的, 就是我的老師仅偎。
    舒己懷_Frank閱讀 282評(píng)論 11 14
  • 持續(xù) 直接就到雙十二了,昨天那上吐下瀉先不談雳殊。我終于知道我為什么總是只能比別人厲害一點(diǎn)點(diǎn)了橘沥。因?yàn)槲覜](méi)有辦法堅(jiān)持,我...
    沙師弟23閱讀 197評(píng)論 0 0