Java System.identityHashCode 内部返回不同的值
Java System.identityHashCode returning different value internally
Java 方法 System.identityHashCode(...) return 当我使用 this 引用,与在同一对象的变量引用上调用它相比。
class MyObject {
public void test(MyObject that){
LOGGER.info("this hash: {}",System.identityHashCode(this));
LOGGER.info("that hash: {}",System.identityHashCode(that));
LOGGER.info("equals: {}",this == that);
}
}
和测试...
MyObject o = new MyObject();
o.test(o);
和输出...
this hash: 263009111
that hash: 524075148
equals: false
什么会导致这种情况发生?有问题的真实对象是一个 Hibernate 实体,但我已将上述测试直接添加到代码中,它在特定场景中显示了相同的行为。为什么对象使用 this 关键字会显示与引用自身不同的身份哈希码?我还通过设置对象的某些字段并确认本地字段设置为相同的值来确认引用是正确的。
所以如果引用是正确的,为什么 identityHashCode(...) return 是两个不同的值,为什么“==”运算符会失败?我的印象是这个方法是专门为识别对同一逻辑对象的引用而实现的?
它们是两个独立的对象(即使它们在概念上可能包含相同的数据),正如 ==
为假这一事实所证明的那样。
System.identityHashCode()
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
换句话说,标准 hashCode
仅使用对象的地址。每个不同的对象都会赋予不同的值。这与休眠无关,这就是 System.identityHashCode()
设计的工作方式。
如果您想要您期望的行为,请对休眠返回给您的对象使用 equals
和 hashCode
方法。
您很可能正在使用某种树结构:
this->A<-that
对 A
所做的更改无论是通过 this
还是 that
都可以通过任一引用看到,但它们仍然是两个不同的 java 对象,即使它们包装相同内在价值观。这很可能是用于支持延迟加载值之类的休眠代理对象。
要亲自确认这一点,请在调试器中逐步执行并查看实际对象。
Java 方法 System.identityHashCode(...) return 当我使用 this 引用,与在同一对象的变量引用上调用它相比。
class MyObject {
public void test(MyObject that){
LOGGER.info("this hash: {}",System.identityHashCode(this));
LOGGER.info("that hash: {}",System.identityHashCode(that));
LOGGER.info("equals: {}",this == that);
}
}
和测试...
MyObject o = new MyObject();
o.test(o);
和输出...
this hash: 263009111
that hash: 524075148
equals: false
什么会导致这种情况发生?有问题的真实对象是一个 Hibernate 实体,但我已将上述测试直接添加到代码中,它在特定场景中显示了相同的行为。为什么对象使用 this 关键字会显示与引用自身不同的身份哈希码?我还通过设置对象的某些字段并确认本地字段设置为相同的值来确认引用是正确的。 所以如果引用是正确的,为什么 identityHashCode(...) return 是两个不同的值,为什么“==”运算符会失败?我的印象是这个方法是专门为识别对同一逻辑对象的引用而实现的?
它们是两个独立的对象(即使它们在概念上可能包含相同的数据),正如 ==
为假这一事实所证明的那样。
System.identityHashCode()
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
换句话说,标准 hashCode
仅使用对象的地址。每个不同的对象都会赋予不同的值。这与休眠无关,这就是 System.identityHashCode()
设计的工作方式。
如果您想要您期望的行为,请对休眠返回给您的对象使用 equals
和 hashCode
方法。
您很可能正在使用某种树结构:
this->A<-that
对 A
所做的更改无论是通过 this
还是 that
都可以通过任一引用看到,但它们仍然是两个不同的 java 对象,即使它们包装相同内在价值观。这很可能是用于支持延迟加载值之类的休眠代理对象。
要亲自确认这一点,请在调试器中逐步执行并查看实际对象。