Как HashMap в Java использует equals () и hashCode () для поиска объектов? - PullRequest
0 голосов
/ 05 июня 2018

Я определил класс Point, как показано ниже, переопределяя equals() и hashCode().Я ожидал, что в методе main() «Ключ найден» будет напечатан, но это не так.

Насколько я понимаю, Java использует equals() и hashCode() для добавления или поиска объектов в HashMap.Я не уверен, что я делаю здесь не так.

import java.util.*;

public class Point {
  int row = 0;
  int col = 0;

  public Point(int row, int col) {
    this.row = row;
    this.col = col;
  }

  public String toString() {
    return String.format("[%d, %d]", row, col);
  }

  public boolean equals(Point p) {
    return (this.row == p.row && this.col == p.col);
  }

  public int hashCode() {
    return 31 * this.row + this.col;
  }

  public static void main(String[] args) {
    HashMap<Point, Integer> memo = new HashMap<>();
    Point x = new Point(1, 2);
    Point y = new Point(1, 2);
    memo.put(x, 1);

    if (x.equals(y))
      System.out.println("x and y are equal");

    System.out.println("Hashcode x= " + x.hashCode() + " Hashcode y= " + 
                       y.hashCode());

    if (memo.containsKey(y)) {
      System.out.println("Key found");
    }
  }
}

output
x and y are equal
Hashcode x= 33 Hashcode y= 33

1 Ответ

0 голосов
/ 05 июня 2018

Проблема в том, что вы на самом деле не переопределяете метод equals().Метод equals(), который вы пытаетесь переопределить , принимает в качестве параметра Object, а не Point объект.Поэтому реализованный вами метод equals() на самом деле не вызывается.

...