感觉泛型用得比较多,在ArrayUtils类里面:
public static <T> Set<T> asSet(T... element) { HashSet<T> elements = new HashSet<T>(element.length); Collections.addAll(elements, element); return elements; }
看到Enumeration这个类觉得面生,但又用得不少,翻看源码:
public interface Enumeration<E> {
boolean hasMoreElements(); E nextElement();
}
,这个不多做解释,直接翻到Iterator的源码,
/** * An iterator over a collection. {@code Iterator} takes the place of * {@link Enumeration} in the Java Collections Framework. Iterators * differ from enumerations in two ways: * 1. Iterators allow the caller to remove elements from the * underlying collection during the iteration with well-defined * semantics. * 2. Method names have been improved. * * @author Josh Bloch * @see Collection * @see ListIterator * @see Iterable * @since 1.2 */ public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
删掉了部分注释,大意是:
1. Iterator取代了Enumeration,并添加了remove方法;
2.Iterator对方法名做了优化。
所以我们可以简单地理解,Enumeration就是Iterator的早期版,但由于遍历确实比Iterator快,所以在不需要删除功能和fail-fast功能的时候,用Enumeration遍历更快。
网上可看到的信息,还有一个区别是Iterator支持fail-fast,我不清楚,先略过。
再看两段代码,
public enum Flag{one,more}
&
public @interface Dic { public enum CacheNameEnum{ CA_ADMIN("ca_admin"), CA_TIME("time"); private String mapId; public String getMapId() { return mapId; } CacheNameEnum(String mapId) { this.mapId = mapId; } } CacheNameEnum[] key(); boolean cache() default false; String handler() default ""; }
这里出现了一个enum,那它和Enumeration有什么区别和联系呢?
enum是一种特殊的数据类型,Enumeration是一个接口类。先说说enum怎么使用吧,
tips:enum不能作为包名。
public enum EnumTest { MONDAY,TUESDAY; public void doPost(){ } }
1、enum可以替代class声明一个类,也可放在类的内部;
2、enum声明的常量最好大写,逗号分隔;
3、不另外定义方法,可以不在末尾加分号,定义方法需要加分号;
public class EnumTest { enum Day { MONDAY,TUESDAY; public String name; public void doPost(){ System.out.println("name: " + this.name); } } public static void main(String[] args){ Day.MONDAY.doPost(); System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.MONDAY.name()); System.out.println(Day.MONDAY); } }
,打印结果:
使用方法介绍完毕,大致明了,总结下。
1、enum类型实际上继承自Enum类,是一种限定对象实例个数的类类型;
2、Enum类自带两个属性,ordinal和name,name是定义的常量的名称,oridinal同常量定义顺序,从0开始;
3、可以自定义属性,定义构造方法,如Dic类。
for(Day day : EnumSet.range(Day.MONDAY,Day.THURSDAY)) { System.out.println(day); }
可以用EnumSet遍历指定段的Enum对象。
java1.7的switch语句加入了对enum的支持,我大胆猜测,内部实现应该是比对enum的oridinal值。
这篇文章写得贼好,特别深: https://blog.csdn.net/javazejian/article/details/71333103
里面讲到单例模式的实现,写得特别好,我打算另外写篇博客整理下,这里就不赘述了,主要代码就是:
/** * Created by wuzejian on 2017/5/9. * 枚举单例 */ public enum SingletonEnum { INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; } }
但这篇文章讲到,反编译enum类的代码后,可以看到继承了Enum类,java1.7上没有。