Java等于一个类。= =与.equals相同


77

我们可以==Class变量执行而不是equals期望相同的结果吗?

例如:

Class clazz = xyz;

案例A:

if(clazz == Date.class) {
// do something
}

情况B:

if(Date.class.equals(clazz)) {
// do something
}

案例A和案例B在功能上是否相同?



13
@mre,我的问题特别是关于Class类型的实例的。是否保证类加载器针对给定的数据类型返回Class的相同实例。
Ramesh

根据一些快速实验,结果似乎是肯定的。不过,我不知道它是否得到保证。
Clockwork-Muse

Answers:


92

类是最终的,因此其equals()不能被覆盖。它的equals()方法是从Object继承的,该Object读取

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

所以是的,对于类或任何不重写的类型,它们是相同的 equals(Object)

为了回答您的第二个问题,每个ClassLoader只能加载一个类一次,并且对于给定的完全限定名称,它将始终为您提供相同的Class。


8
是否有可能两个不同的类加载器产生了不同的类,而他们遇到了?
voipp

3
@voipp您可能有两个从两个不同的类加载器获得的“相同”类的实例,但在正常情况下不会出现这种情况
kbolino

1
即使确实发生了这种情况,根据equals方法,仍将这两个类视为不同的。如果您想知道它们是否“相同”,则必须按名称比较这些类,但是它们仍然可能是同一类的两个不同版本,甚至可能是两个不同开发人员造成的偶然冲突。从jvm的角度来看,即使它们确实是相同的,它们也是不可互换的。
杰里米·怀斯坎普

3
我就是这么说的,不是吗?我正在引用@kbolino的评论,它关于从两个不同的类加载器中获取“相同”类的两个实例。
杰里米·怀斯坎普

2
@kbolino在OSGI和ESB(例如ServiceMix)的世界中,曾经有一个例子是从不同的类加载器获得“相同”类的多个实例的例子更为普遍。
彼得·柯比

6

是。

看一下Class类的描述,并注意它是equals从继承的Object,方法读取如下:

“ Object类的equals方法在对象上实现了最有区别的对等关系;也就是说,对于x和y的任何非空引用值,当且仅当x和y引用同一个对象时,此方法返回true(x = = y的值为true)。”


4

是的,因为equals(...)用于class的代码如下:

public boolean equals(Object obj) {
    return (this == obj);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.