在java中传递对象时会发生什么?

时间:2012-06-16 04:06:06

标签: java object hashcode hash-code-uniqueness

我知道当我们传递对象时,我们将其引用作为值传递。但是你得到的这个值是使用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

5 个答案:

答案 0 :(得分:6)

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

现在,恰好发生了,获得表示对象的唯一值的一种好方法是使用其内部存储器地址。这就是hashcode()的默认实现。但hashcode() 使用内存地址的事实 意味着hashcode() 定义内存地址。

答案 1 :(得分:2)

  

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

没有。

来自JSL

  

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

Harnessing Java

阅读此页面

答案 2 :(得分:2)

java中Object的哈希码的默认实现基于对象的内存地址,这也是引用的内容。

这并不意味着调用hashCode()来获取引用。这不是发生的事情。引用变量只是在从实例化(new Whatever())获取后才保存内存地址。实际上,类实现通常会覆盖hashcode()以执行不同的操作。

答案 3 :(得分:2)

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

然而,大多数JDK 期望,如果a.equals(b),那么a.hashCode() == b.hashCode()

反过来从未预料到;即如果!a.equals(b),则 <{1}}。但是,如果这通常不是 ,性能将受到影响。换句话说,预计a.hashCode() != b.hashCode()几乎没有碰撞。

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

答案 4 :(得分:1)

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