Java中类类型的相等性测试:用==还是equals()方法?
在Java中比较Class类型对象:
== vs equals 咱们直接切入正题:当你需要比较两个Class类型对象是否代表同一个类时,两种方式在绝大多数场景下效果一致,但==更直接高效,下面给你掰扯清楚细节:
为什么==完全靠谱?
在JVM中,同一个类(由同一个类加载器加载)的Class对象是单例的——也就是说,不管你通过X.class、obj.getClass()还是Class.forName("X")获取的,都是同一个内存地址的实例。用==直接比较引用地址,本质就是判断它们是不是同一个Class实例,结果绝对准确,而且不需要额外的方法调用,效率更高。
比如你写:
String.class == "hello".getClass() // 返回true
完全没问题,因为两者指向的是JVM中唯一的String类的Class对象。
equals在这里的表现如何?
Class类是final的,不能被继承,而且它没有重写Object类的equals方法——也就是说,Class.equals(Object)默认就是调用==比较引用地址,和直接用==的效果完全一样。比如:
String.class.equals("hello".getClass()) // 同样返回true
所以在正常情况下,两种写法没区别,但equals多了一层方法调用,完全没必要。
特殊情况:不同类加载器加载的同名类
如果是不同类加载器加载的同名类,它们的Class对象是不同的实例。这时候不管用==还是equals,都会返回false——这也符合预期,因为JVM会把它们当成不同的类。
总结
- 优先用
==:简洁、高效,结果可靠,是Java社区比较推荐的写法。 - 用
equals也没错,但完全没必要,因为它和==效果一致,还多了方法调用的开销。
内容的提问来源于stack exchange,提问作者marsouf
相关产品推荐
相关产品推荐

