Tag: 哈希码

hashcode是否返回内存地址?

可能重复: 什么是对象哈希码 hashCode()和identityHashCode()如何在后端工作? 我不是在讨论String类或其他重写hashcode的类。 假如我只是创建一个Object类的新对象,那么hashcode()或者在任何情况下都是true, identityHashCode(Object x)返回该identityHashCode(Object x)的内存地址?

Java:为方便起见,在equals()中使用hashCode()?

考虑以下测试用例,将equals中的hashCode()方法用作方便的快捷方式是一种不好的做法吗? public class Test { public static void main(String[] args){ Test t1 = new Test(1, 2.0, 3, new Integer(4)); Test t2 = new Test(1, 2.0, 3, new Integer(4)); System.out.println(t1.hashCode() + “\r\n”+t2.hashCode()); System.out.println(“t1.equals(t2) ? “+ t1.equals(t2)); } private int myInt; private double myDouble; private long myLong; private Integer myIntObj; public Test(int i, double d, long l, […]

Object.toString或Object.hashCode是否给出了对象的内存地址

通常声称Object.hashCode() (所有对象的默认实现Object.hashCode()的实现给出了对象的内存地址。 该声明通常附加于Object.to String()产生的特殊输出的解释。 请看这里的例子。 对于我所知道的任何JVM / JRE,情况肯定不是这样。 尤其是因为地址通常是64位长。 而且,垃圾收集器重定位对象,因此地址会发生变化。 我已经看到声称它可以是对象的初始内存地址。 但是,由于许多对象具有相似的地址,因此对于哈希码来说这将是一个糟糕的选择。 是否存在或曾经存在任何广泛使用的JVM / JRE,它们是对象的(初始)内存地址。 我知道Object类的JavaDoc表明实现的hashCode可能是内存地址。 但我怀疑这是一个从未更新过的严重过时的声明。 实际上,当前的Oracle JVM不使用内存地址(但可以配置为执行此操作): https://stackoverflow.com/a/16105878/545127 hashCode是一个内存地址的想法是一个历史人工制品: https://stackoverflow.com/a/13860488/545127 我的问题是, 任何广泛使用的JVM是否(和哪些)使用内存地址作为其(默认)实现。

为什么我们需要在java中重写equals和hashcode,为什么我们不能使用Object类实现

伙计们请让我知道,在现实世界中我们为什么需要覆盖equals和hashcode,并且我们不能使用Object的equals和hashcode。

两个具有相同哈希码的Java对象不一定相等吗?

我理解为什么为两个相等(通过equals )对象提供相同的哈希码很重要。 但反过来也是如此,如果两个对象具有相同的哈希码,它们必须相等吗? 合同是否仍然有效? 我无法找到可能发生这种情况的示例,因为如果所有参与equals方法的属性也被用于覆盖hashcode方法,那么我们将始终使用相同的对象的哈希码。 请给出意见。

所有JVM /系统中的Java,Object.hashCode()结果常量?

Object.hashCode()的输出是否必须在同一个对象的所有JVM实现上相同? 例如,如果”test”.hashCode()在1.4上返回1 ,它是否可能在1.6上返回2 。 或者,如果操作系统不同,或者实例之间存在不同的处理器架构,该怎么办?

使用hashCode()测试字符串相等性

是否有任何理由不能使用hashCode方法测试Java字符串的相等性? 所以基本上,而不是…. “hello”.equals(“hello”) 你可以用…… “hello”.hashCode() == “hello”.hashCode() 这很有用,因为一旦字符串计算出它的哈希码,那么比较一个字符串就像比较一个int一样有效,因为字符串缓存了哈希码,而且很可能字符串在字符串池中,如果你设计它办法。

关于HashMap put()和get()方法如何工作的内部结构(仅基本逻辑)

当我们使用put()方法在HashMap类中放置一个键实例说“key”和一个Value实例说“value”时, HashMap类在内部做了什么。 当我们说hashMap.get(key)时,它如何检索值? 编辑 :我不想要这里的细节,基本上试图理解更大的图片以及equals()和hashcode()方法在put()和get()操作中的作用。

HashMap调整方法实现细节

正如标题所示,这是一个关于HashMap#resize的实现细节的问题 – 当内部数组的大小加倍时。 这有点罗嗦,但我真的试图certificate我对此有了最好的理解…… 这发生在此特定桶/箱中的条目以Linked方式存储的时刻 – 因此具有确切的顺序并且在问题的上下文中这是重要的 。 一般来说, resize也可以从其他地方调用,但让我们只看一下这种情况。 假设您将这些字符串作为键放在HashMap (右侧是HashMap hashcode 之后的 HashMap#hash – 这是内部重新散列。)是的,这些都是精心生成的,而不是随机的。 DFHXR – 11111 YSXFJ – 01111 TUDDY – 11111 AXVUH – 01111 RUTWZ – 11111 DEDUC – 01111 WFCVW – 11111 ZETCU – 01111 GCVUR – 11111 这里有一个简单的模式 – 最后4位对于所有这些都是相同的 – 这意味着当我们插入这些键中的8个(总共9个)时,它们最终会在同一个桶中; 在第9个HashMap#put ,将调用resize 。 因此,如果当前在HashMap有8个条目(具有上面的一个键) – 这意味着在该映射中有16个桶,并且它们的最后4个位决定了条目最终的位置。 […]

为什么Java中的String.hashCode()有很多冲突?

为什么String.hashcode()有这么多冲突? 我在jdk1.6中读取String.hashCode(),下面是代码 public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; } 这对我来说很混乱,因为它有很多冲突; 虽然它不需要是唯一的(我们仍然可以依赖于equals()),但是更少的冲突意味着更好的性能而无需访问链表中的条目。 假设我们有两个字符,那么只要我们能找到两个匹配下面的方程的字符串,那么我们就会有相同的hashcode() a * […]