一、Class对象间的比较
结论
都可以,推荐使用 == 进行比较
原因
1、源码
查看Class类的源码可知,其并未重现equals()方法,当调用equals()方法时,实际上调用的时Object类的equals()方法,里面直接进行的==判断,因此使用equals()方法与使用 == 得到的结果是一样的。
2、原理
Class类是一个特殊类,它用于表示JVM运行时类或接口的信息,是类被JVM加载后在内存中创建的一个该类的Class对象,用来存储该类的各种信息。
因此Class类对象的创建只与JVM有关,也就是只与类加载器有关。
对于同一个类加载器,对于每个类型都只生成并管理唯一的一个Class对象,因此,是可以直接使用 == 来实现两个Class对象的比较。
二、枚举类型的比较
结论
都可以,推荐使用 == 进行比较
原因
1、源码
查看Enum类的equals()方法可知,其仅仅对两个对象做了 == 比较。因此,equals()方法与 == 是等价的。
2、原理
这里简单说下,详细的实现原理请参考这篇文章。
枚举的构造函数是私有的,声明的每个枚举对象都是枚举类的一个实例,不可能构造出新的对象。
3、使用 == 的优点
-
不会抛出NPE
enum Color { BLACK, WHITE }; Color nothing = null; if (nothing == Color.BLACK); // runs fine if (nothing.equals(Color.BLACK)); // throws NullPointerException
-
在编译器检查类型兼容性
enum Color { BLACK, WHITE }; enum Chiral { LEFT, RIGHT }; if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!