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è)方法剂癌。
- boolean hasMoreElements()
測(cè)試此枚舉是否包含更多的元素。
返回值:當(dāng)且僅當(dāng)此枚舉對(duì)象至少還包含一個(gè)可提供的元素時(shí)翰绊,才返回 true佩谷;否則返回 false。
-
E nextElement()
如果此枚舉對(duì)象至少還有一個(gè)可提供的元素监嗜,則返回此枚舉的下一個(gè)元素谐檀。
返回值:此枚舉的下一個(gè)元素。
拋出:NoSuchElementException - 如果沒(méi)有更多的元素存在裁奇。
Enumeration代碼舉例
- 使用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
- 使用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é)果為:
星期三
星期二
星期四
星期一
- 使用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方法介紹:
- boolean hasNext()
如果仍有元素可以迭代,則返回 true厦坛。(換句話說(shuō)五垮,如果 next 返回了元素而不是拋出異常,則返回 true)杜秸。
返回值:如果迭代器具有多個(gè)元素放仗,則返回 true。
-
E next()
返回迭代的下一個(gè)元素撬碟。
返回值:迭代的下一個(gè)元素诞挨。
拋出:NoSuchElementException - 沒(méi)有元素可以迭代。
- 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缎罢。