Enum 和 EnumSet, EnumMap及其特性

Enum 和 EnumSet, EnumMap及其特性

枚举类 (Enum)

  1. 枚举类的对象是有限且固定的
  2. 枚举类的构造器一定是private(即无法从外部调用构造器,只在构造枚举值时调用)
> *构造器一般用来初始化定义和重写成员方法*
  1. enum 实现了 Seriablizable和Comparable接口
  2. 非抽象枚举类无法派生子类,所有枚举值都是public static final 的(需要在枚举类的第一行给出)
常用方法:
  1. int CompareTo(E o) 返回两对象的顺序:如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回零;
  2. String name() 返回枚举值的本名(括号外的名字)不会因toSting的改变而改变;
  3. static E values() 返回一个包含所有枚举值的数组方便遍历
  4. String toString()
  5. int ordinal() 返回枚举值的索引值(从0开始)
  6. static valueOf(Class enumType, String name)

    注意:name必须是枚举值的字面值,与toString方法无关

  7. boolean equals() 不重写是等于==
用法:
  1. 在switch中用枚举类型
```java

public int getDeliveryTimeInDays() {  
switch (status) {  
    case ORDERED: return 5;  
    case READY: return 2; 
    case DELIVERED: return 0;  
}

}  
```
  1. 枚举类强大的属性,方法和构造器
```java
public class Demo1 {
private stage s;
public enum stage{
	good(0){

		@Override
		public boolean getBoolean() {
			// TODO Auto-generated method stub
			return true;
		}
		
	},
	bad(1) {
		@Override
		public boolean getBoolean() {
			// TODO Auto-generated method stub
			return false;
		}
	};
	stage(int a){
		num=a;
	}
	private int num;
	public abstract boolean getBoolean();
	public int getNum() {
		return num;
	}
}
public Demo1(String s) {
	this.s=stage.valueOf(s);
}
// Methods that set and get the status variable.
public static void main(String[] args) {
	
	System.out.println(new Demo1("good").getStage().getNum());
}
}

```

EnumSet

EnumSet 是一种专门为枚举类型所设计的 Set 类型。

与HashSet相比,由于使用了内部位向量表示,因此它是特定 Enum 常量集的非常有效且紧凑的表示形式。

它提供了类型安全的替代方法,以替代传统的基于int的“位标志”,使我们能够编写更易读和易于维护的简洁代码。

EnumSet 是抽象类,其有两个实现:RegularEnumSet 、JumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。

在很多场景中的枚举常量集合操作(如:取子集、增加、删除、containsAll和removeAll批操作)使用EnumSet非常合适;如果需要迭代所有可能的常量则使用Enum.values()。

  • EnumSet allOf(Class elementType): 创建一个包含指定枚举类里所有枚举值的EnumSet集合。

  • EnumSet complementOf(EnumSet e): 创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet集合,新EnumSet集合包含原EnumSet集合所不包含的、此类枚举类剩下的枚举值。

(即新EnumSet集合和原EnumSet集合的集合元素加起来是该枚举类的所有枚举值)。

  • EnumSet copyOf(Collection c): 使用一个普通集合来创建EnumSet集合。
  • EnumSet copyOf(EnumSet e): 创建一个指定EnumSet具有相同元素类型、相同集合元素的EnumSet集合。
  • EnumSet noneOf(Class elementType): 创建一个元素类型为指定枚举类型的空EnumSet。
  • EnumSet of(E first,E…rest): 创建一个包含一个或多个枚举值的EnumSet集合,传入的多个枚举值必须属于同一个枚举类。
  • EnumSet range(E from,E to): 创建一个包含从from枚举值到to枚举值范围内所有枚举值的EnumSet集合。
public class Demo1 {
	private status s;
	private static EnumSet<status> badOnes=EnumSet.of(status.bad);
	public enum status{
		... ...
	}
	public Demo1(String s) {
		this.s=status.valueOf(s);
	}
	public static List<Demo1> getAllBadOnes(List<Demo1> input) {
        return input.stream().filter(
          (s) -> badOnes.contains(s.getStatus()))
            .collect(Collectors.toList());
    }
    // Methods that set and get the status variable.
	public static void main(String[] args) {
		
		System.out.println(new Demo1("good").getStatus().getNum());
	}
}

上述的代码可以将不同的Demo1的LIst中的bad Demo清除并返回全是good的Demo1 list


EnumMap

EnumMap是一个专门化的映射实现,用于将枚举常量用作键。与对应的 HashMap 相比,它是一个高效紧凑的实现,并且在内部表示为一个数组:

	public static EnumMap<status,List<Demo1>> getAllkindsOfDemo1(List<Demo1> ls){
 	EnumMap <status,List<Demo1>>de=new EnumMap<status,List<Demo1>>(status.class);
 	for(Demo1 s: ls) {
 		status sta=s.getStatus();
 		if(de.containsKey(sta)) {
 			de.get(sta).add(s);
 		}else {
 			List<Demo1> n=new ArrayList<>();
 			n.add(s);
 			de.put(sta, n);
 		}
 	}
 	return de;
 }
 ```
 
* 上面的方法将输入的demo list 按照status分类并通过EnumMap 输出;很强大
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值