5

我知道当我们传递对象时,我们将其引用作为值传递。但是你得到的这个值是使用hashcode()正确的方法(根据我的测试是一样的)?既然hashcode()不是内存地址,也不能保证一直获取唯一值,那么在传递对象的时候会不会发生碰撞之类的奇怪事情呢?

(假设hashcode()没有被覆盖,即它返回与 相同的值System.identityHashCode()

三个像这样的问题很多,但我找不到相关资源来讨论传递的值是什么以及如何获得它?

编辑: 这是我的测试。默认toSting()使用hashCode()内部并将其转换为十六进制值。那么当我们传递对象时,这是传递的值吗?或者 java 做了什么来跟踪所有的对象(被传递)所以不会有任何引用冲突

Object o = new Object();
System.out.println(o);
System.out.println(o.toString()); //both prints same thing - java.lang.Object@10385c1
4

5 回答 5

6

hashcode()与 Java 的内部内存存储没有任何关系。它只是一个应该返回可以表示对象的唯一值的方法。

现在,碰巧获得表示对象的唯一值的一种好方法是使用其内部内存地址。这就是默认实现的hashcode()作用。但是hashcode() 使用内存地址并不意味着定义hashcode() 内存地址。

于 2012-06-16T04:32:14.540 回答
2

但是你得到的这个值是使用 hashcode() 方法对吗(根据我的测试它是一样的)?

不。

来自JSL

引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。

从Harnessing Java中阅读此页面

于 2012-06-16T04:15:05.917 回答
2

java中hashcode for的默认实现Object是基于对象的内存地址,也就是引用。

这并不意味着hashCode()被调用来获取引用。这不是发生的事情。new Whatever()引用变量只是在从实例化( )中获取内存地址后保存它。事实上,类实现重写 hashcode() 来做一些不同的事情是很常见的。

于 2012-06-16T04:15:14.527 回答
2

没有要求或期望它hashCode()是独一无二的。它不是一种身份方法。

但是,大部分 JDK 都期望if a.equals(b), then a.hashCode() == b.hashCode()

没想到会出现相反的情况。即如果!a.equals(b)那么不需要a.hashCode() != b.hashCode()但是,如果不是通常情况,性能会受到影响。换句话说,hashCode()预计很少有碰撞。

hashCode()类中的默认实现Object通常使用内存地址来生成hashCode()但它不返回地址,语言规范也没有要求这样做。

于 2012-06-16T18:57:50.690 回答
1

通过Java Objects引用传递意味着当你传递一个Object实际上你传递原始对象引用时。哈希码取决于与该对象关联的字段值。hashcode 与 real 无关,memory address.具有相同值的两个对象具有不同的hashcode. 即使您创建了两个不同的对象但具有相同的值,它们的哈希码也将始终取决于您的哈希函数的效率

于 2012-06-16T04:39:00.733 回答