javaenumeration
A. java中enumeration問題
我給你舉個例子你就知道了
en可看著盒子
hasMorElements比作問盒子有沒有雞蛋
有時我們問有幾個雞蛋啊盒子。看來這個en.hasMoreElements()就ok了
為什麼還要這個en==null呢
那我問你,盒子是那個啊?沒有盒子怎麼辦啊?沒有盒子別提雞蛋了,
其實哥告訴你,你說的en.hasMoreElements()是盒子為空(數量)而en==null是盒子為無(盒子就沒有)。
這是兩個問題。所以都要判斷。
B. JAVA里String類和Enumeration類是什麼關系
Enumeration 是一個介面,本身和 String 沒有任何關系,從這句String str =(String)enu.nextElement(); 來看的話,enu 中只是存儲了 String 類型的元素,當然 Enumeration 也不止是只存儲 String 類型的數據,也可以是 Integer, Float , Long ,其它類 等等。
(String)enu.nextElement() 不是對 Enumeration 向下轉型,而對 enu.nextElement() 返回的結果轉型。
C. enum在java中是什麼意思
Enum 類型的介紹
枚舉類型(Enumerated Type) 很早就出現在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變數提供更大的取值范圍。
舉個例子來說明一下,如果希望為彩虹描繪出七種顏色,你可以在 Java 程序中通過常量定義方式來實現。
清單 1. 常量定義
PublicstaticclassRainbowColor{
//紅橙黃綠青藍紫七種顏色的常量定義
publicstaticfinalintRED=0;
publicstaticfinalintORANGE=1;
publicstaticfinalintYELLOW=2;
publicstaticfinalintGREEN=3;
publicstaticfinalintCYAN=4;
publicstaticfinalintBLUE=5;
publicstaticfinalintPURPLE=6;
}
使用的時候,你可以在程序中直接引用這些常量。但是,這種方式還是存在著一些問題。
類型不安全
由於顏色常量的對應值是整數形,所以程序執行過程中很有可能給顏色變數傳入一個任意的整數值,導致出現錯誤。
沒有命名空間
由於顏色常量只是類的屬性,當你使用的時候不得不通過類來訪問。
一致性差
因為整形枚舉屬於編譯期常量,所以編譯過程完成後,所有客戶端和伺服器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增加新的枚舉值後,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現錯誤。
類型無指意性
由於顏色枚舉值僅僅是一些無任何含義的整數值,如果在運行期調試時候,你就會發現日誌中有很多魔術數字,但除了程序員本身,其他人很難明白其奧秘。
如何定義 Enum 類型
為了改進 Java 語言在這方面的不足彌補缺陷,5.0 版本 SDK 發布時候,在語言層面上增加了枚舉類型。枚舉類型的定義也非常的簡單,用 enum 關鍵字加上名稱和大括弧包含起來的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的 enum 方式來重新定義:
enumRainbowColor{RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE}
從上面的定義形式來看,似乎 Java 中的枚舉類型很簡單,但實際上 Java 語言規范賦予枚舉類型的功能非常的強大,它不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴展允許開發者給枚舉類型增加任何方法和屬性,也可以實現任意的介面。另外,Java 平台也為 Enum 類型提供了高質量的實現,比如默認實現 Comparable 和 Serializable 介面,讓開發者一般情況下不用關心這些細節。
回到本文的主題上來,引入枚舉類型到底能夠給我們開發帶來什麼樣好處呢?一個最直接的益處就是擴大 switch 語句使用范圍。5.0 之前,Java 中 switch 的值只能夠是簡單類型,比如 int、byte、short、char, 有了枚舉類型之後,就可以使用對象了。這樣一來,程序的控制選擇就變得更加的方便,看下面的例子:
清單 2. 定義 Enum 類型
//定義一周七天的枚舉類型
publicenumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}
//讀取當天的信息
WeekDayEnumtoday=readToday();
//根據日期來選擇進行活動
switch(today){
Mon:dosomething;break;
Tue:dosomething;break;
Wed:dosomething;break;
Thu:dosomething;break;
Fri:dosomething;break;
Sat:playsportsgame;break;
Sun:havearest;break;
}
對於這些枚舉的日期,JVM 都會在運行期構造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch 語句就根據此來進行執行跳轉。
如何定製 Enum 類型
除了以上這種最常見的枚舉定義形式外,如果需要給枚舉類型增加一些復雜功能,也可以通過類似 class 的定義來給枚舉進行定製。比如要給 enum 類型增加屬性,可以像下面這樣定義:
清單 3. 定製枚舉類型
//定義RSS(ReallySimpleSyndication)種子的枚舉類型
publicenumNewsRSSFeedEnum{
//雅虎頭條新聞RSS種子
YAHOO_TOP_STORIES("http://rss.news.yahoo.com/rss/topstories"),
//CBS頭條新聞RSS種子
CBS_TOP_STORIES("http://feeds.cbsnews.com/CBSNewsMain?format=xml"),
//洛杉磯時報頭條新聞RSS種子
LATIMES_TOP_STORIES("http://feeds.latimes.com/latimes/news?format=xml");
//枚舉對象的RSS地址的屬性
privateStringrss_url;
//枚舉對象構造函數
privateNewsRSSFeedEnum(Stringrss){
this.rss_url=rss;
}
//枚舉對象獲取RSS地址的方法
publicStringgetRssURL(){
returnthis.rss_url;
}
}
上面頭條新聞的枚舉類型增加了一個 RSS 地址的屬性 , 記錄頭條新聞的訪問地址。同時,需要外部傳入 RSS 訪問地址的值,因而需要定義一個構造函數來初始化此屬性。另外,還需要向外提供方法來讀取 RSS 地址。
如何避免錯誤使用 Enum
不過在使用 Enum 時候有幾個地方需要注意:
enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
定義 enum 類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符號;但如果有定製方法,那麼最後一個枚舉值與後面代碼要用分號';'隔開,不能用逗號或空格。
由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( 『 == 』 ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
看下面的這個例子:
清單 4. 避免錯誤使用 Enum 示例
//定義一個一周七天的枚舉類型
packageexample.enumeration.codes;
publicenumWeekDayEnum{
Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sat(6),Sun(7);
privateintindex;
WeekDayEnum(intidx){
this.index=idx;
}
publicintgetIndex(){
returnindex;
}
}
//客戶端程序,將一個枚舉值通過網路傳遞給伺服器端
packageexample.enumeration.codes;
importjava.io.IOException;
importjava.io.ObjectOutputStream;
importjava.io.OutputStream;
importjava.net.InetSocketAddress;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassEnumerationClient{
publicstaticvoidmain(String...args)throwsUnknownHostException,IOException{
Socketsocket=newSocket();
//建立到伺服器端的連接
socket.connect(newInetSocketAddress("127.0.0.1",8999));
//從連接中得到輸出流
OutputStreamos=socket.getOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(os);
//將星期五這個枚舉值傳遞給伺服器端
oos.writeObject(WeekDayEnum.Fri);
oos.close();
os.close();
socket.close();
}
}
//伺服器端程序,將從客戶端收到的枚舉值應用到邏輯處理中
packageexample.enumeration.codes;
importjava.io.*;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassEnumerationServer{
publicstaticvoidmain(String...args)throwsIOException,ClassNotFoundException{
ServerSocketserver=newServerSocket(8999);
//建立伺服器端的網路連接偵聽
Socketsocket=server.accept();
//從連接中獲取輸入流
InputStreamis=socket.getInputStream();
ObjectInputStreamois=newObjectInputStream(is);
//讀出客戶端傳遞來的枚舉值
WeekDayEnumday=(WeekDayEnum)ois.readObject();
//用值比較方式來對比枚舉對象
if(day==WeekDayEnum.Fri){
System.out.println("'s");
}elseif(day.equals(WeekDayEnum.Fri)){
System.out.println("'s");
}else{
System.out.println("'s");
}
//用switch方式來比較枚舉對象
switch(day){
caseMon:
System.out.println("DoMondaywork");
break;
caseTue:
System.out.println("DoTuesdaywork");
break;
caseWed:
System.out.println("DoWednesdaywork");
break;
caseThu:
System.out.println("DoThursdaywork");
break;
caseFri:
System.out.println("DoFridaywork");
break;
caseSat:
System.out.println("DoSaturdaywork");
break;
caseSun:
System.out.println("DoSundaywork");
break;
default:
System.out.println("Idon'tknowwhichisday");
break;
}
ois.close();
is.close();
socket.close();
}
}
列印結果如下:
client Friday enum value is same as server's
Do Friday work
通過程序執行結果,我們能夠發現在分布式條件下客戶端和服務端的虛擬機上都生成了一個枚舉對象,即使看起來一樣的 Fri 枚舉值,如果使用等號『 == 』進行比較的話會出現不等的情況。而 switch 語句則是通過 equal 方法來比較枚舉對象的值,因此當你的枚舉對象較復雜時候,你就需要小心 override 與比較相關的方法,防止出現值比較方面的錯誤。
Enum 相關工具類
JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 介面實現。EnumSet 中裝入的所有枚舉對象都必須是同一種類型,在其內部,是通過 bit-vector 來實現,也就是通過一個 long 型數。EnumSet 支持在枚舉類型的所有值的某個范圍中進行迭代。回到上面日期枚舉的例子上:
enumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}
你能夠在每周七天日期中進行迭代,EnumSet 類提供一個靜態方法 range 讓迭代很容易完成:
for(WeekDayEnumday:EnumSet.range(WeekDayEnum.Mon,WeekDayEnum.Fri)){
System.out.println(day);
}
列印結果如下:
Mon
Tue
Wed
Thu
Fri
EnumSet 還提供了很多個類型安全的獲取子集的 of 方法,使你很容易取得子集:
EnumSet<WeekDayEnum>subset=EnumSet.of(WeekDayEnum.Mon,WeekDayEnum.Wed);
for(WeekDayEnumday:subset){
System.out.println(day);
}
列印結果如下:
Mon
Wed
與 EnumSet 類似,EnumMap 也是一個高性能的 Map 介面實現,用來管理使用枚舉類型作為 keys 的映射表,內部是通過數組方式來實現。EnumMap 將豐富的和安全的 Map 介面與數組快速訪問結合到一起,如果你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看下面的例子:
清單 5. EnumMap 示例
//定義一個EnumMap對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型
privatestaticMap<WeekDayEnum,RainbowColor>schema=
newEnumMap<WeekDayEnum,RainbowColor>(WeekDayEnum.class);
static{
//將一周的每一天與彩虹的某一種色彩映射起來
for(inti=0;i<WeekDayEnum.values().length;i++){
schema.put(WeekDayEnum.values()[i],RainbowColor.values()[i]);
}
}
System.out.println("Whatistheluckycolortoday?");
System.out.println("It's"+schema.get(WeekDayEnum.Sat));
當你詢問周六的幸運色彩時候,會得到藍色:
清單 6. 運行結果
What is the lucky color today?
It's BLUE
結束語
Enum 類型提出給 JAVA 編程帶了了極大的便利,讓程序的控制更加的容易,也不容易出現錯誤。所以在遇到需要控製程序流程時候,可以多想想是否可以利用 enum 來實現。
D. java中的枚舉是什麼意思
Java的Enumeration(枚舉,注釋②)便是具有這些限制的一個反復器的例子。除下面這些外,不可再用它做其他任何事情:
(1) 用一個名為elements()的方法要求集合為我們提供一個Enumeration。我們首次調用它的nextElement()時,這個Enumeration會返回序列中的第一個元素。
(2) 用nextElement()獲得下一個對象。
(3) 用hasMoreElements()檢查序列中是否還有更多的對象。
②:「反復器」這個詞在C++和OOP的其他地方是經常出現的,所以很難確定為什麼Java的開發者採用了這樣一個奇怪的名字。Java 1.2的集合庫修正了這個問題以及其他許多問題。
E. java Enumeration這個類重要嗎
Enumeration介面
Enumeration介面本身不是一個數據結構。但是,對其他數據結構非常重要。 Enumeration介面定義了從一個數據結構得到連續數據的手段。例如,Enumeration定義了一個名為nextElement的方法,可以用來從含有多個元素的數據結構中得到的下一個元素。
Enumeration介面提供了一套標準的方法,由於Enumeration是一個介面,它的角色局限於為數據結構提供方法協議。下面是一個使用的例子:
//e is an object that implements the Enumeration interface
while (e.hasMoreElements()) {
Object o= e.nextElement();
System.out.println(o);
}
實現該介面的對象由一系列的元素組成,可以連續地調用nextElement()方法來得到 Enumeration枚舉對象中的元素。Enumertion介面中僅定義了下面兩個方法。
·boolean hasMoreElemerts()
測試Enumeration枚舉對象中是否還含有元素,如果返回true,則表示還含有至少一個的元素。
·Object nextElement()
如果Bnumeration枚舉對象還含有元素,該方法得到對象中的下一個元素。
【例】
/*
* @(#)DemoEnumeration.java
* 演示Enumeration介面的使用
* /
import java.util.*;
class DemoEnumeration{
public static void main(String[] args){
//實例化MyDataStruct類型的對象
MyDataStruct mySataStruct=new myDataStruct();
//得到描述myDataStruct類型對象的enumeration對象
Enumeration myEnumeration =myDataStruct.getEnum();
//使用對象循環顯示myDataStruct類型的對象中的每一個元素
while (myEnumeration.hasMoreElements())
System.out.println(myEnumeration.nextElement());
}
}
//MyEnumeration類實現Enumeration介面
class MyEnumerator implements Enumeration
{
int count; // 計數器
int length; //存儲的數組的長度
object[] dataArray; // 存儲數據數組的引用
//構造器
MyEnumeration(int count,int length,object[] dataArray){
this.count = count;
this.length= length;
this.dataArray=dataArray;
}
public boolean hasMoreElements() {
return (count< length);
}
public Object nextElement() {
return dataArray[count++];
}
}
//MyDataStruct類用於實例化一個簡單的、可以提供enumeration對象
//給使用程序的數據結果對象
class MyDataSttuct
{
String[] data;
// 構造器
MyDataStruct(){
data=new String[4]
data[0] ="zero";
data[1]="one";
data[2] ="two";
data[3]="three";
}
// 返回一個enumeration對象給使用程序
Enumeration getEnum() {
return new MyEnumeration(0,data.length,data);
}
程序的運行結果為:
zero
one
two
three
F. java中關於Enumeration.hasMoreElements()的問題
import java.util.Enumeration;
import java.util.Hashtable;
public class Enums {
public static String[] copare(String[] a, String[] b) {
int cnt = 0; // 添加==============
Hashtable<String, String> hashtable = new Hashtable<String, String>();
Hashtable<String, String> hashtable_new = new Hashtable<String, String>();
for (int i = 0; i < b.length; i++) {
hashtable.put(b[i], b[i]);
}
for (int i = 0; i < a.length; i++) {
if (!hashtable.contains(a[i])) {
hashtable_new.put(a[i], a[i]);
cnt++; // 添加==============
}
}
Enumeration<String> enumeration = hashtable_new.keys();
int i = 0;
String[] c = new String[cnt]; // 修改==============
while (enumeration.hasMoreElements()) {
c[i] = (String) enumeration.nextElement();
i++;
}
return c;
}
public static void main(String[] args) {
String[] A = { "a", "b", "cc", "dd" };
String[] B = { "a", "b" };
String[] C = copare(A, B);
for (int i = 0; i < C.length; i++) {
System.out.println(C[i]);
}
}
}
=============
數組是要分配空間之後才能用的。
你沒給他分配,那他就是個null,當然就不能用了