iva*_*off 224 java identity hashcode
当Java中的类不覆盖hashCode()时,打印此类的实例会给出一个很好的唯一编号.
对象的Javadoc说关于hashCode():
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.
但是当类重写hashCode()时,我怎样才能获得它的唯一编号?
Bri*_*new 335
System.identityHashCode(yourObject)将yourObject的"原始"哈希码作为整数给出.唯一性不一定得到保证.Sun JVM实现将为您提供与此对象的原始内存地址相关的值,但这是一个实现细节,您不应该依赖它.
编辑:答案修改后汤姆的评论下面重新.内存地址和移动对象.
Val*_*her 28
Object的javadoc指定了
这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.
如果一个类重写了hashCode,则意味着它想要生成一个特定的id,这将(人们可以希望)具有正确的行为.
您可以使用System.identityHashCode获取任何类的id.
也许这个快速,肮脏的解决方案可行?
public class A {
static int UNIQUE_ID = 0;
int uid = ++UNIQUE_ID;
public int hashCode() {
return uid;
}
}
Run Code Online (Sandbox Code Playgroud)
这也给出了正在初始化的类的实例数.
hashCode()
方法不是为对象提供唯一标识符.它宁可将对象的状态(即成员字段的值)消化为单个整数.该值主要由一些基于散列的数据结构(如地图和集合)使用,以有效地存储和检索对象.
如果您需要对象的标识符,我建议您添加自己的方法而不是覆盖hashCode
.为此,您可以创建如下所示的基本接口(或抽象类).
public interface IdentifiedObject<I> {
I getId();
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
public class User implements IdentifiedObject<Integer> {
private Integer studentId;
public User(Integer studentId) {
this.studentId = studentId;
}
@Override
public Integer getId() {
return studentId;
}
}
Run Code Online (Sandbox Code Playgroud)
对于id生成,您可以查看我的博客帖子,我试图解释一些生成唯一ID的方法.
// looking for that last hex?
org.joda.DateTime@57110da6
Run Code Online (Sandbox Code Playgroud)
hashcode
如果您在对对象执行 a 操作时正在研究Java 类型.toString()
,则底层代码如下:
Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)
我想出了这个解决方案,该解决方案适用于我在多个线程上创建对象并且可序列化的情况:
public abstract class ObjBase implements Serializable
private static final long serialVersionUID = 1L;
private static final AtomicLong atomicRefId = new AtomicLong();
// transient field is not serialized
private transient long refId;
// default constructor will be called on base class even during deserialization
public ObjBase() {
refId = atomicRefId.incrementAndGet()
}
public long getRefId() {
return refId;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
193433 次 |
最近记录: |