如何有意义地为java.lang.Class定义hashCode和equals<;T>;?

如何有意义地为java.lang.Class定义hashCode和equals<;T>;?,java,hash,hashmap,equals,hashcode,Java,Hash,Hashmap,Equals,Hashcode,如果需要将类用作映射键的一部分,那么定义哈希码和等于的正确方法是什么? 类继承了对象中的那些,这些对象检查引用相等性并返回内存地址作为hashcode,但在我看来,equals和hashcode类的定义有什么意义尚不清楚类 我应该使用class.getClass().hashCode()吗例如(我们有类;)来使用实际实例的方法? 但这似乎不是正确的做法。 例如,在For类中: 每个数组也属于反映为类的类 对象,该对象由具有相同元素类型和 尺寸数 因此,在某些情况下,对象之间共享相同的类?那么接下

如果需要将
用作
映射
键的一部分,那么定义
哈希码
等于
的正确方法是什么?
继承了
对象
中的那些,这些对象检查引用相等性并返回内存地址作为hashcode,但在我看来,
equals
hashcode
类的定义有什么意义尚不清楚

我应该使用
class.getClass().hashCode()吗例如(我们有
类;
)来使用实际实例的方法?
但这似乎不是正确的做法。
例如,在For
类中:

每个数组也属于反映为类的类 对象,该对象由具有相同元素类型和 尺寸数


因此,在某些情况下,对象之间共享相同的
?那么接下来该怎么做呢?也许可以使用
class.hashCode()
class.equals()
来使用引用相等?这里一点也不确定。

方法
String getName()
返回类的唯一的字符串表示形式。如果您的程序不使用多个类加载器,您可以将equals/hashCode的此字符串用作普通字符串。

hashCode
equals的实现从
java.lang.Class
继承自
java.lang.Object
是有意义的,通常是合适的,因为一个类的所有实例都保证从
getClass()
返回相同的
class
对象,即

new Integer(2).getClass() == new Integer(3).getClass();
这在某种程度上隐藏在文档中;报告写道:

返回:

表示此对象的运行时类的类对象

另见:

文字,Java规范第15.8.2节™ 语言规范

写道:

类文本计算为当前实例类的定义类加载器(§12.2)定义的命名类型(或void)的类对象

并写道:

行为良好的类装入器维护以下属性:

  • 给定相同的名称,一个好的类加载器应该总是返回相同的类对象
恶意类加载器可能会违反这些属性。但是,它不能破坏类型系统的安全性,因为Java虚拟机可以防止这种情况


是的,如果相同的类定义由不同的类加载器加载,则类对象将不相等。由于运行时将这些类视为独立类(它们恰好共享相同的名称,但不需要相似,更不用说二进制兼容),因此通常需要这样做。

但我不做
Map
。我的问题是
Class
何时是键的一部分。而不是键itself@Cratylus答案是一样的;使用getName()返回类对象的唯一字符串表示形式;在哈希/equals中使用此字符串就像它是一个字符串实例字段一样。没有什么可定义的,因为hashcode和equals已经实现了,我很难想象你会如何改变这个实现,甚至更难想象你为什么要改变这个实现。@Jenschauder:使用Eclipse自动生成
hashCode
equals
它发出了一个警告,抱怨
hashCode
equals
没有为
类定义。这让我抓狂了我担心这是否是一个有效的警告,我应该对此做些什么。我不知道你想做什么,但“Class”是一个类,它是java本身的一部分。你不能为它实现任何东西。您尝试添加hashCode和equals的源文件的全名是什么?@jenschauder:不确定源文件要求的是什么。
Class
是一个类的成员,可以用作
Map
No,Class是由java.lang.Class类实现的类型。每个类T都有一个实例。它的类型是class。附带说明:像Tomcat这样的应用程序使用分层类加载器,这可能会让你头疼。Tomcat为所有应用程序提供了自己的类加载器堆栈。