是类<;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中的不可变对象是不能通过任何正常(非反射)执行路径更改其内部状态的对象。这意味着:
- 该类没有定义任何可访问的方法来改变其内部状态
- 类的设计方式可以防止子类改变其内部状态
类
类满足以下要求:
- 它没有提供改变其内部状态的方法
- 类本身是
,不能进行子类最终的
当然,实际的类定义是由JVM通过类加载器加载的,一旦定义,就为JVM的生命周期设置,并且不会更改。Java中的不可变对象是不能通过任何正常(非反射)执行路径更改其内部状态的对象。这意味着:
- 该类没有定义任何可访问的方法来改变其内部状态
- 类的设计方式可以防止子类改变其内部状态
类
类满足以下要求:
- 它没有提供改变其内部状态的方法
- 类本身是
,不能进行子类最终的
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
),该标识在对象的生命周期内保持不变。声明当类或接口的加载程序可能是可访问的时,不能卸载该类或接口(以避免类被重新加载,因为对象