在 Java 中测试类类型之间的相等性



我应该使用 == 运算符还是使用更可靠的方法(如 Object.equals(Object)

String.class == obj.getClass()String.class.equals(obj.getClass())

PS:我只对使用类类型比较感兴趣(不使用instanceof运算符(

不,只要 JVM 中没有不同的类加载器。Java 中的每个对象都有一个对应的java.lang.Class对象,并且无论对象的实际实例数量如何,它都会加载到 JVM 中一次。

两个版本基本相等,因为java.lang.Class使用Object内部的标准实现:

public boolean equals(Object obj) {
    return (this == obj);
}

既然Class是最终的,你就不能覆盖它。

但是请注意,一旦您使用不同的类加载器,您可能会得到两个基本相同但不同的实例的类,即 java.lang.String != java.lang.String如果两者都来自不同的类加载器(该特定示例可能不会发生,这只是一个说明(。

最后,如果您调用它的实例永远不会null(并且String.class不会为空(,则您可能仍希望使用 equals()。这样,您就可以加强使用equals()而不是==的习惯,并且在极不可能的情况下,Class会在某个时候改变其equals()的实现,现在使用它可能更安全。

最新更新