Class中的Class <t>是不可变的,也称为Class <t>是HashMap的安全密钥吗?</t> </t>

时间:2013-02-21 03:01:26

标签: java hashmap immutability hashcode java.lang.class

我现在已经潜伏了一段时间,但还没有找到答案。 有人在这里提到Class<T>作为关键(我想),但我找不到帖子了。 无论如何,这个问题值得一个正确的答案(如果有一千个帖子帖子就道歉)。

Class<T>是不可变的吗?是否可以安全有效地用作密钥(常量hashCode()执行)?

我的猜测是肯定的,因为类定义在运行时不会改变。但我不太确定......谢谢!

编辑:谈论Java。

4 个答案:

答案 0 :(得分:2)

Java中的不可变对象是不能通过任何普通(非反射)执行路径更改其内部状态的对象。这意味着:

  • 该类定义了无法改变其内部状态的可访问方法
  • 该类的设计方式是防止子类改变其内部状态

Java Class类满足以下要求:

  • 它没有提供改变其内部状态的方法。
  • 班级本身为final,不能分类。

当然,实际的类定义由JVM通过类加载器加载,一旦定义,就会为该JVM的生命周期设置,并且不会更改。

答案 1 :(得分:2)

1)我不确定它是否可以称为不可变,至少在经典意义上,看一看

public final class Class<T>
    ...
    native void setSigners(Object[] signers);
    ...
    native void setProtectionDomain0(java.security.ProtectionDomain pd);
    ...
    void setAnnotationType(AnnotationType type) 
    ...

2)我们可以在HashMap中使用它,Class是一个单例,它的hashCode和equals基于它的标识,但需要注意的是一个类在不同的类加载器中会有不同的实例,所以来自classloader1的MyClass.class!= MyClass来自classloader2的.class

答案 2 :(得分:0)

hashCode()的{​​{1}}方法未被覆盖,但JDK指定了有关Class方法的以下内容:

getClass()

返回此Object的运行时类。 返回的Class对象是被表示的类的public final Class<?> getClass() 方法锁定的对象。

实际结果类型为static synchronized,其中Class<? extends |X|>是调用|X|的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:

getClass

因此,对于任何实例Number n = 0; Class<? extends Number> c = n.getClass(); T objT obj2obj.getClass()都会返回相同的(不可变的)obj2.getClass()对象。

但是,请注意类型擦除:对于Class<T>LinkedList<T> l1,情况并非如此,因为两者都将返回类型擦除类LinkedList<U> l2,而不是Class<LinkedList> }具体针对Class<LinkedList<T>>

答案 3 :(得分:0)

是(假设类加载器是好的,因为在给定相同名称时,ir总是返回相同的Class对象。)

hashCode实例的Class是其对象标识(Class不重新定义hashcode),它在对象的生命周期内保持不变。 JLS表示 one在其加载器可能可访问时不得卸载类或接口(为了避免重新加载类,这对应用程序来说是不透明的,因为Class对象的对象标识会有所不同。

请注意,具有相同名称但由不同类加载器加载的类具有不同的哈希码。通常这应该不是问题,因为它们将是different run-time types,并且它们的实例不会与赋值兼容。