Java хэш-код POD? - PullRequest
       5

Java хэш-код POD?

0 голосов
/ 23 августа 2010

У меня есть этот простой класс

public class Position{
   int x;
   int y;

   Position(int x,int y){...}

   public int hashCode(){
    Integer ix = this.x;
    Integer iy = this.y;

    return 13*iy.hashCode() + 43*ix.hashCode();
   }
}

Я сохраняю экземпляры в hashMap, но потом не могу их извлечь.Я боюсь его реализации hashcode.Есть ли способ реализовать это, когда x и y не являются объектами?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

У меня есть предположение: вы также переопределяли метод equals?В Java, когда вы реализуете один, вы должны реализовать другой.

В частности, если вы используете Position экземпляры в качестве ключей, HashMap будет сравнивать их с equals.В противном случае два ключа могут случайно иметь один и тот же хэш, но разные значения.

С HashMap#get

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
2 голосов
/ 23 августа 2010

То, что вы не можете получить их, не имеет ничего общего с вашей реализацией hashCode.

Поскольку Integer # hashCode просто возвращает его значение, вы можете упростить его до

 public int hashCode(){
      return 13*iy+43*ix;
 }

Меняете ли вы ix и iy после помещения объекта на карту? Это большое «нет-нет», и оно полностью портит хеш-таблицу.

Кроме того, вам также необходимо определить Position#equals.

...