2016-03-25 1 views
0

Я действительно запутался в реализации метода hashcode() и equals(). Код для вставки в наш каталог.Что действительно происходит внутри методов equals(), hashcode() и compare()?

class Employee { 

     int id; 
     String name; 

     public Employee(int id, String name) { 
      super(); 
      this.id = id; 
      this.name = name; 
     } 

     @Override 
     public int hashCode() { 
     final int prime = 3; 
     int result = 1; 
     result = (prime * result) + id; 
     result = (prime * result) + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

     @Override 
     public boolean equals(Object obj) { 
     Employee other = (Employee) obj; 

       if (this == obj) 
        return true; 

       if (obj == null) 
        return false; 
       if (getClass() != obj.getClass()) 
       return false; 

       if (id != other.id) 
       return false; 
       if (name == null) { 
       if (other.name != null) 
          return false; 
       } else if (!name.equals(other.name)) 
          return false; 
       return true; 
     } 

    } 

[править 1] Doubt1: что каждый Comparision на самом деле означает?

Теперь я реализовал интерфейс компаратора и его метод.

class EmpNameComparator implements Comparator<Employee> { 
     @Override 
     public int compare(Employee a, Employee b) { 
       return a.name.compareToIgnoreCase(b.name); 
     } 
    } 

[править 2] Doubt2: он собирается сравнить два adjusent объекты из списка <> или что-то еще происходит, что он делает внутри?

+0

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

+0

Пожалуйста, разместите часть кода, в котором вы используете списки. – Berger

+0

Я не использовал его нигде, это просто для понимания цели. учитывая, что я выполняю employeeList.sort(); как действительно сравнивает() ведет себя? – piechuckerr

ответ

3

this == obj проверяет, является ли текущий Объект ТАКЖЕ Объект как другой.

Если они являются одним и тем же объектом, они, конечно же, «равны».

compareToIgnoreCase сравнивает два String объектов, не обращая внимания на различия/нижний регистр в верхнем регистре:

Сравнивает две строк лексикографический, игнорируя регистры. Этот метод возвращает целое число, знак которого является то, что вызова СотрагеТо с нормированным версиями строк, где тематические различия были устранены путем вызова Character.toLowerCase (Character.toUpperCase (символ)) на каждом характер.

Итак, когда вы сортировать список Employee с пользовательским компаратором:

Collections.sort(employeeList, new EmpNameComparator()); 

два сотрудников, имеющим такое же имя (без учета различных случаев), будет считаться тем же сотрудником для работы сортировочной.

Обратите внимание, что вы не можете сказать, если Джон предстанет перед JOHN, или наоборот.

+0

Я знаю метод compareToIgnoreCase, что такое Employee a и Employee b по сравнению со списком, который я собираюсь сортировать? – piechuckerr

+0

Алгоритм сортировки, независимо от того, что он есть, должен сравнить сотрудников в списке, чтобы отсортировать его. a и b - два сотрудника списка, которые алгоритм должен сравнивать –

1

Doubt1: Так что же здесь происходит, я знаю, что это относится к текущему текущему объекту, почему мы сравниваем это == obj на равных. что означает каждое сравнение?

Когда вы делаете this == obj, вы в основном проверить, является ли ссылка на this объекта и объекта сравнения т.е. obj такой же или нет.

Если вы звоните equals() то сравнивает ли this объект и объект сравниваемых т.е. obj являются одинаковыми или не основаны на методе equals() переопределен вами. Например, this.equals(obj) вернет true тогда и только тогда, когда он удовлетворяет условию в методе equals().

Поскольку вы переопределили метод hashCode(), расчет хеш-кода будет выполнен с помощью переопределенного метода.

Существует договор между hashCode() и equals(), и если вы переопределяете один из них, тогда вы также должны переопределить другие, иначе он не будет работать должным образом.

Doubt2: что это значит для сравненияIgnoreCase() означает? он собирается сравнить два объекта-аддиента из списка <> или что-то еще происходит, что он делает внутри?

Это просто нормальное сравнение строк между двумя объектами. В этом случае он будет объединяться с name членом объекта Employee для Employee a and Employee b.

В отличии от compareTo(), compareToIgnoreCase() делает регистрозависимость сравнение и вернет true, даже если в случае двух строк не являются одинаковыми. Для примера,

fooBar 
FooBAR 

Здесь compareTo() вернется false но compareToIgnoreCase() вернется true.

+0

проверьте изменения. Я имею в виду, откуда берутся fooBar и FooBar, являются ли эти смежные элементы из списка? Я не понимал, что сравнение происходит в фоновом режиме. – piechuckerr

+0

Это не то, что делает. –

+1

@ user2004685, потому что вы понятия не имеете, что ref1 == ref2 is – Ingo