2015-05-14 2 views
-2

В интервью мне было предложено эффективно продемонстрировать реализацию метода hashcode и equals, поэтому я построил ниже pojo, но интервьюер сказал, что это не правильное и лучшее выполнение, поскольку это может привести к столкновению, пожалуйста, вы можете посоветовать ниже реализации хэш-код является правильным или нетЭффективное использование хэш-кода pojo в java

public class Emp { 

    String name, job; 
    int salary; 

    public Emp(String n, String j, int s) { 
     this.name = n; 
     this.job = j; 
     this.salary = s; 

    } 

    public int hashcode() { 
     return name.hashCode() + job.hashCode() + salary; 
    } 

    public boolean equals(Object o) { 

     Emp e1 = (Emp) o; 
     return this.name.equals(e1.name) && this.job.equals(e1.job) && this.salary == e1.salary; 
    } 
    } 
+0

Что произойдет, если один из этих значений равно нулю? Что произойдет, если объект, переданный в equals(), не является экземпляром Emp? –

+0

http://stackoverflow.com/a/113600/3850595 –

+0

@KevinWorkman Спасибо, да, я согласен, я не думал об этих ситуациях, не могли бы вы посоветовать, как я могу справиться с этими ситуациями здесь сами? –

ответ

1

Просто Суммируя hashCode не очень хорошая идея. Там есть библиотеки (например, Project Lombok), которые делают это за вас. Или вы можете просто запросить вашу среду IDE для ее создания. Напр. Eclipse has an option генерирует hashCode на основе полей вашего класса.

Чтобы экстраполировать бит; давайте предположим, что у вас есть следующие hashCode S:

name.hashCode() = 200 
job.hashCode() = 400 
salary   = 1000000 

Но вы могли бы иметь еще один уникальный работник, который заканчивается тем, что имели следующие hashCode S:

name.hashCode() = 400 
job.hashCode() = 200 
salary   = 1000000 

Как вы можете видеть, даже если мы имеем два различных сотрудники здесь, мы заканчиваем тем же hashCode для обоих. Желательным свойством hashCode является обеспечение того, чтобы объекты, которые вы хешировали, получили распространение как можно более равномерно.

Если вы посмотрите на все «хорошие» версии hashCode, вы увидите умножение на простые числа. Это гарантирует, что, несмотря на то, что сумма всех отдельных хэш-кодов заканчивается одинаково, у вас все еще есть общий hashCode, который отличается. Вы можете попробовать это с помощью приведенного выше примера.

+1

Помните, что это был вопрос интервью, поэтому интервьюер будет искать простое решение, напрямую закодированное.Не обязательно использовать внешнюю библиотеку. –

+1

@AndrewFielden: Я понял, что позже и добавил еще несколько деталей. –

2

Вы используете:

  • Два String#hashCode заклинания, чей алгоритм обсуждаются - см here интересная нить
  • Вы хотите добавить зарплату (как int !!) для заключительной части
  • Наконец, самое главное, использовать семена: умножить каждое поле штриха и сложит

Вы можете посмотреть, как ваша IDE автоматически генерирует хэш-код, чтобы получить лучшую идею.

В Eclipse:

  • правой кнопкой мыши на источник (или alt - shift - S)
  • Source
  • Generate 'hashCode()' and 'equals()'...
Смежные вопросы