是类<;T>;Java中不可变的,也称为类<;T>;HashMap的安全密钥?

是类<;T>;Java中不可变的,也称为类<;T>;HashMap的安全密钥?,java,hashmap,immutability,hashcode,java.lang.class,Java,Hashmap,Immutability,Hashcode,Java.lang.class,我已经在网上潜伏了一段时间,但还没有找到答案。 有人提到类是这里的关键,所以(我想)我再也找不到这个帖子了。 无论如何,这个问题应该得到一个正确的答案(如果有上千条帖子,请道歉) 类是不可变的吗?它能否安全有效地用作密钥(常量hashCode()过执行) 我的猜测是肯定的,因为类定义在运行时不会更改。但我不太确定……谢谢 编辑:谈论Java。Java中的不可变对象是不能通过任何正常(非反射)执行路径更改其内部状态的对象。这意味着: 该类没有定义任何可访问的方法来改变其内部状态 类的设计方式可以

我已经在网上潜伏了一段时间,但还没有找到答案。 有人提到
是这里的关键,所以(我想)我再也找不到这个帖子了。 无论如何,这个问题应该得到一个正确的答案(如果有上千条帖子,请道歉)

类是不可变的吗?它能否安全有效地用作密钥(常量
hashCode()
过执行)

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


编辑:谈论Java。

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

  • 该类没有定义任何可访问的方法来改变其内部状态
  • 类的设计方式可以防止子类改变其内部状态
Java
类满足以下要求:

  • 它没有提供改变其内部状态的方法
  • 类本身是
    最终的
    ,不能进行子类

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

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

  • 该类没有定义任何可访问的方法来改变其内部状态
  • 类的设计方式可以防止子类改变其内部状态
Java
类满足以下要求:

  • 它没有提供改变其内部状态的方法
  • 类本身是
    最终的
    ,不能进行子类
当然,实际的类定义是由JVM通过类加载器加载的,一旦定义,就为JVM的生命周期设置,并且不会更改。

类的
hashCode()
方法不会被覆盖,但是JDK指定了
getClass()
方法的以下内容:

public final Class<?> getClass()
因此,对于任何实例
T obj
T obj2
obj.getClass()
obj2.getClass()
返回相同的(不可变的)
Class
对象

但是,要注意类型擦除:对于
LinkedList l1
LinkedList l2
,这是不正确的,因为两者都将返回类型擦除类
class
,而不是特定于
T
类的
hashCode()
方法不会被覆盖,但是JDK指定了关于
getClass()
方法的以下内容:

public final Class<?> getClass()
因此,对于任何实例
T obj
T obj2
obj.getClass()
obj2.getClass()
返回相同的(不可变的)
Class
对象

但是,要注意类型擦除:对于
LinkedList l1
LinkedList l2
,这是不正确的,因为两者都将返回类型擦除类
class
,而不是特定于
T

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

public final class Class<T>
    ...
    native void setSigners(Object[] signers);
    ...
    native void setProtectionDomain0(java.security.ProtectionDomain pd);
    ...
    void setAnnotationType(AnnotationType type) 
    ...
公共最终类
...
本机void设置签名者(对象[]签名者);
...
本机void setProtectionDomain0(java.security.ProtectionDomain pd);
...
void setAnnotationType(AnnotationType类型)
...
2) 我们可以在HashMap中使用它,类是一个单例,它的hashCode和equals基于它的标识,但需要注意的是,一个类在不同的类装入器中会有不同的实例,因此classloader1中的MyClass.Class!=我不确定它是否可以被称为不可变的,至少在经典意义上,请看一看

public final class Class<T>
    ...
    native void setSigners(Object[] signers);
    ...
    native void setProtectionDomain0(java.security.ProtectionDomain pd);
    ...
    void setAnnotationType(AnnotationType type) 
    ...
公共最终类
...
本机void设置签名者(对象[]签名者);
...
本机void setProtectionDomain0(java.security.ProtectionDomain pd);
...
void setAnnotationType(AnnotationType类型)
...
2) 我们可以在HashMap中使用它,类是一个单例,它的hashCode和equals基于它的标识,但需要注意的是,一个类在不同的类装入器中会有不同的实例,因此classloader1中的MyClass.Class!=classloader2中的MyClass.class是(假设类装入器已安装好,在给定相同名称时,ir始终返回相同的
class
对象的意义上)

Class
实例的
hashCode
是其对象标识(
Class
不重新定义
hashCode
),该标识在对象的生命周期内保持不变。声明当类或接口的加载程序可能可访问时,不能卸载该类或接口(以避免类被重新加载,这对应用程序来说是不透明的,因为
对象的对象标识将不同)

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

是(假设类加载器是良好的behaved,从某种意义上说,当给定相同的名称时,ir总是返回相同的
对象。)

Class
实例的
hashCode
是其对象标识(
Class
不重新定义
hashCode
),该标识在对象的生命周期内保持不变。声明当类或接口的加载程序可能是可访问的时,不能卸载该类或接口(以避免类被重新加载,因为对象