当前位置: 首页 > 知识库问答 >
问题:

Java系统。identityHashCode在内部返回不同的值

明星剑
2023-03-14

Java方法系统。identityHashCode(…)当我使用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关键字显示的身份哈希码与对其自身的引用不同?我还通过设置对象的一些字段并确认本地字段设置为相同的值来确认引用是正确的。那么如果引用是正确的,为什么标识HashCode(...)返回两个不同的值,为什么“==”运算符失败?我的印象是,这种方法是专门为识别对同一逻辑对象的引用而实现的?

共有1个答案

凌景辉
2023-03-14

它们是两个独立的对象(即使它们在概念上可能包含相同的数据),正如==为false这一事实所证明的那样。

系统。identityHashCode()

无论给定对象的类是否重写hashCode(),为给定对象返回与默认方法hashCode()相同的哈希代码。空引用的哈希代码为零。

换句话说,一个仅使用对象地址的标准hashCode。每个不同的对象都会给出不同的值。这与hibernate无关,而是系统的工作方式。identityHashCode()是为工作而设计的。

如果您想要期望的行为,请在hibernate返回给您的对象上使用equalshashCode方法。

你很可能有某种树结构:

<代码>这个-

无论是通过this还是thatA进行更改,都可以通过任何一个引用看到,但它们仍然是两个不同的java对象,即使它们包含相同的内部值。这很可能是hibernate代理对象,用于支持值的延迟加载。

要亲自确认这一点,请在调试器中完成并查看实际对象。

 类似资料:
  • 问题内容: 我在Java中具有JSON序列化对象的字符串表示形式,例如。我如何解析并将其返回到JavaScript上下文,就像在JS中一样?谢谢。 问题答案: Rhino的最新版本只有四个arg,第四个不能为null。为了解决这个问题,您必须创建一个实现org.mozilla.javascript.Callable的简单类: 然后可以像这样调用NativeJSON.parse:

  • 从数据库中提取博客。 为什么这里的blogContent在函数的上下文中是全局的,而我们正在内部更改它,所以它应该返回值,有人能解释为什么会这样吗? 有没有不使用promise/async/await的方法>>>有人给了我答案 我如何从异步调用返回响应? 但这一点我不知道,最主要的是我不知道Ajax。

  • 我试图解决一个问题,我必须在搜索中得到明确的结果。 当我对最喜欢的汽车“法拉利”执行术语查询时。我得到两个名为ABC的结果。在这种情况下,我只是希望返回的结果应该是一个。所以我的要求是,如果我可以应用一个不同的on name字段来接收一个1结果。 谢啦

  • 我试图制作一个for循环脚本,使用Angular创建订单,并将其添加到网页中。我在使用某些for循环时遇到了问题,因为当我使用控制台时。log(),它只输出外部循环,不输出内部循环。我需要把变量的顺序传递给另一个函数,所以我需要这个顺序来获得正确的数据。 结果: 它重复最后一个外环值,而不输出内环值。我对Javascript还是很陌生的,所以我需要一些洞察力和解决方案,也许还有简单的方法?谢谢!

  • 我正在尝试编写一个java代码,该代码将返回运行它的机器的名称,就像访问代码的远程机器的名称一样,而不是它实际运行的机器。我有这段代码,但它在输出中返回父计算机的名称,而不是远程计算机的名称: public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException

  • 当我尝试获取字符串tempdir=System时。getProperty(“java.io.tmpdir”);它将返回我的操作系统“temp”目录路径。e、 普通java应用程序中的g.C:\Users\DATAGU~1\AppData\Local\Temp\。这是正确的。 但是,当我尝试在部署在tomcat6上的web应用程序上获取相同的属性时,它会返回tomcat temp目录路径(例如D:\