3 回答
TA贡献1757条经验 获得超7个赞
好吧,hashCode()
总是返回内存地址并不完全正确。在您的特定情况下,您正在覆盖该函数以基本上返回Subject
引用的 hashCode。
您的评估显示以下输出:
stringops.Student@955a0720
这可能有点令人困惑,因为这实际上不是裸内存地址,而是对toString()
对象方法的调用。
看看Java是如何实现的 toString
:
getClass().getName() + '@' + Integer.toHexString(hashCode())
所以,事实上,这两个对象有不同的内存位置,但是因为你覆盖hashCode()
你不会看到它们。此外,没有办法覆盖 Java 如何选择对象的内存地址(可能除了一些 hack),但是,两个对象不能具有相同的地址。
下次请包含更多文本而不是屏幕截图,以提高其他人对您的问题的搜索能力。
TA贡献1780条经验 获得超4个赞
您刚刚正确地确定了两个不同的对象——即不在同一内存地址的两个对象——确实可以具有相同的哈希码。规则是,如果两个对象通过该.equals()
方法相等,那么它们应该产生相同的哈希码。除了这个和“不同的对象应该尝试有不同的哈希码”的一般想法之外,没有要求不同位置的对象应该有不同的哈希值。
不过,这是一件好事。例如,String
每个具有相同字符序列的两个不同对象应该直观地具有相同的哈希码,以便HashMap<String, T>
可以正确查找字符串。这样,提供与String
用作键的对象不同但具有相同逻辑值的对象将正常工作;所有String
具有相同字符序列的 s 散列到同一个位置。
TA贡献1752条经验 获得超4个赞
hashcode 是一个 int 值,由 hascode() 方法返回。
Object.java 定义了 hascode() 并且每个 java 类都是 Object.java 的子类,因此每个类都继承它。
如果他/她希望覆盖它,则取决于特定类的开发人员。类的开发人员可能会选择(尽管是一种不好的做法)为类的所有对象重新运行相同的常量 int 值。
通常 hascode 取决于对象的一个或多个属性的值。即使开发人员可能会尽力返回唯一的哈希码,但仍然(哈希码冲突)两个不同的对象最终可能会得到相同的哈希码。
一次只能将一个内存位置分配给一个对象。
两个不同对象的哈希码(位于内存中的两个不同地址)可能相同也可能不同
还有一个相关的概念:equals 和 hascode 方法的合同。它表示如果两个对象通过调用 equals 返回 true,则两个对象必须具有相同的哈希码。请注意,这是定义的合同,但由开发人员开发类并编写哈希码方法以遵守合同。一个糟糕的实现可能会导致两个对象返回不同的hascode,对于equals方法返回true。
添加回答
举报