Java中hashCode的用途是什么?


Answers:


222

hashCode()用于铲装Hash实现喜欢HashMapHashTableHashSet等。

从中接收的值hashCode()用作存储集合/映射元素的存储桶编号。该存储桶编号是集合/映射中元素的地址

完成后contains(),它将获取元素的哈希码,然后查找哈希码指向的存储桶。如果在同一存储桶中找到了多个元素(多个对象可以具有相同的哈希码),则它将使用该equals()方法来评估对象是否相等,然后确定contains()是对还是假,或者确定元素是否可以为是否添加到集合中。


27
嗨,好友。.非常好的答案,但我发现了一个非常有趣的链接,它带有易于理解的实际示例:coderanch.com/t/321515/java/java/HashCode
Logicalj 2013年

谢谢爱淑 现在,我对带有存储桶相关说明的哈希码有了清楚的了解。
Balasubramani

2
“如果在同一个存储桶中找到了多个元素。那么它使用equals()进行求值”,那么,如果仅找到一个与哈希码匹配的元素,它将直接返回true怎么办?但是由于多个对象可以具有相同的哈希码,因此必须运行该对象才能equals()评估匹配的元素是否相等,否则可能会给您带来意外的结果,对吗?
Saorikido

除了存储桶,哈希码是对象调用以确定对象在内存中存储顺序的方法。如果对象相等,则其哈希码也必须相等。(此陈述的相反说法是错误的)
NoName

1
在什么情况下程序员会手动调用该hashCode()方法?
红衣主教-恢复莫妮卡

33

Javadoc

返回对象的哈希码值。支持此方法是为了使哈希表受益,例如java.util.Hashtable

的总合同hashCode为:

  • 在Java应用程序执行期间,只要在同一对象上多次调用它,该hashCode方法就必须始终返回相同的整数,前提是不修改该对象的equals比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。

  • 如果根据该equals(Object)方法两个对象相等,则hashCode在两个对象中的每个对象上调用该方法必须产生相同的整数结果。

  • 要求,如果两个对象根据是不相等的equals(java.lang.Object)方法,然后调用hashCode在每个两个对象的方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是Java编程语言不需要此实现技术。)


14

返回的值hashCode()是对象的哈希码,它是对象的内存地址(十六进制)。

根据定义,如果两个对象相等,则它们的哈希码也必须相等。如果重写该equals()方法,则会更改两个对象的相等方式,并且Object的实现hashCode()不再有效。因此,如果重写equals()方法,则还必须重写该hashCode()方法。

这个答案来自Java SE 8官方教程文档


13

hashCode()是接受对象并输出数值的函数。如果对象不变,则对象的哈希码始终相同。

功能,如HashMapHashTableHashSet,等需要存储的对象将使用hashCode模其内部数组的大小在什么“记忆位置”(即阵列位置)来存储对象的选择。

在某些情况下可能会发生冲突(两个对象最终使用相同的哈希码),当然,需要小心解决。


6

尽管哈希码与您的业务逻辑无关,但是在大多数情况下,我们必须照顾好它。因为当您将对象放入基于哈希的容器(HashSet,HashMap ...)时,该容器会放置/获取元素的哈希码。


不,不是。它放置/获取密钥。hashCode仅用于存储区,
Lorne侯爵,

3

哈希码是从任何对象生成的数字。

这就是允许将对象快速存储/检索到哈希表中的原因。

想象下面的简单示例

在你面前的桌子上。您有9个盒子,每个盒子都标有1到9的数字。在这些盒子中还可以存储一堆完全不同的对象,但是一旦它们放在那里,您就需要尽快找到它们。

您需要的是一种立即确定将每个对象放入哪个盒子的方法。它的工作原理类似于索引。您决定找到卷心菜,因此您要查找卷心菜所在的盒子,然后直接去那个盒子拿它。

现在想像一下,您不想打扰索引,而是希望能够从对象中立即找到它所在的盒子。

在示例中,让我们使用一种非常简单的方法进行操作-对象名称中的字母数。因此,白菜在方框7中进入,豌豆在方框3中进入,火箭在方框6中进入,班卓琴在方框5中以此类推。

那犀牛呢?它有10个字符,因此我们将略微更改算法并“环绕”,以便在框1中放入10个字母的对象,在框2中放入11个字母,依此类推。那应该覆盖任何物体。

有时候,一个盒子里有不止一个物体,但是如果您要寻找火箭,比较花生和火箭要比检查一大堆白菜,豌豆,班卓琴和犀牛要快得多。

那是一个哈希码。一种从对象获取数字以将其存储在哈希表中的方法。在Java中,哈希码可以是任何整数,每种对象类型都负责生成自己的整数。查找对象的“ hashCode”方法。

来源- 这里


-1

hashCode()的用途之一是建立Catching机制。看这个例子:

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}

“建立捕捉机制”是什么意思?这段代码如何说明呢?
洛恩侯爵

-1

hashCode()是由JVM为每次对象创建生成的唯一代码。

我们用来hashCode()对哈希相关的算法(例如Hashtable,Hashmap等)执行一些操作。

hashCode()使搜索操作容易的优势,因为当我们搜索具有唯一代码的对象时,它有助于发现该对象。

但是我们不能说hashCode()是对象的地址。它是JVM为每个对象生成的唯一代码。

这就是为什么哈希算法是当今最受欢迎的搜索算法。


4
哈希码不是唯一的。2个不相等的对象可能返回相同的哈希码。
拉尼尔·坎拉斯(Ranielle Canlas)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.