2017-01-07 1 views
0

Здесь Equals_to_operator является классом и имеет параметризованный конструктор public Equals_to_operator(int dd, int mm, int yy). e и f - два объекта, которые вызывают параметризованный конструктор с тем же аргументом. Я обогнал hashCode и сделал и хэш-код объектов. Eventhough, если сделать hashcode таким же (расположение памяти объекта таким же), он дает Output: not equalsКогда мы делаем хэш-код из 2 объектов, указывающих на один адрес, почему это временно?

Я хочу выполнить то же самое, сделав hashcode таким же, где я иду не так?

public class Equals_to_operator { 
    private int dd,mm,yy; 

    public Equals_to_operator(int dd, int mm, int yy) { 

     this.dd = dd; 
     this.mm = mm; 
     this.yy = yy; 
    } 
    @Override 
    public String toString() { 
     return "Equals_to_operator [dd=" + dd + ", mm=" + mm + ", yy=" + yy + "]"; 
    } 
    public int hashCode() { 
     return 1; 

    } 
    public static void main(String[] args) { 
     Equals_to_operator e=new Equals_to_operator(7, 1, 2016); 
     System.out.println(e+"\n"+e.hashCode()); 
     Equals_to_operator f=new Equals_to_operator(7, 1, 2016); 
     System.out.println(f+"\n"+f.hashCode()); 
     if (e==f) 
      System.out.println("equals"); 
     else 
      System.out.println("not equals"); 
    } 
+0

Вы создаете два разных объекта, поэтому они не будут совпадать с оператором ==. Изменение результата из метода hashCode не влияет на «местоположение памяти» объекта. –

+0

, когда мы делаем hashCode двух объектов одинаковыми, не будут ли оба объекта указывать на то же место памяти? –

+3

Возвращаемое значение hashCode() не является адресом памяти. – synchronizer

ответ

1

Eventhough делает то же хэш-код (расположение в памяти объекта же), что дает выход: не равен

Имея же хэш-код не означает, что объекты равны.

memory location of object same ... Это не то, что делает хэш-код. откуда ты это понял?

если (е == е)

Это означает, что условие будет истинным тогда и только тогда как e и f указывают на тот же объект.

на основании метода equals, как объекты, указываемые e и f равны, но == но проверяет равенство ссылок не содержимое.

+0

так, когда e и f указывают на то же место в памяти? –

+0

, если вы пишете 'e = f;' – Azodious

+2

@RushabhOswal Используя 'e = f', ваш код« забудет »старый« f »вообще, потому что он становится пригодным для сбора мусора. В любом случае ни «hashCode», ни «equals» не играют в нем. – dasblinkenlight

1
== // checks equality in terms of memory address 
something.equals(somethingElse) // enforces your own terms of what "equals" is if. If you wish to do this, override "equals()" 
hashCode() // used when you're trying to use a collection such as a hashmap to map a key object to a value 

Вы, вероятно, следует искать в документации по этим пунктам, но разница между == и .equals() является то, что вам действительно нужно понять.

РЕДАКТИРОВАТЬ: примечание: если вы больше смотрите в hashCode(), вы где-то читаете, что представление объекта toString() по умолчанию (no overridden toString()) является формой адреса памяти , это распространенное заблуждение. На самом деле это hashCode, но я отвлекся.

+0

Это не заблуждение, реализация Object.hashCode по умолчанию использует адрес памяти в качестве основы для формирования hashCode. Но это не работает наоборот, изменение hashCode не влияет на адрес памяти. См. Object.hashCode Javadoc: насколько это разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования JavaTM.) –

2

У вас возникло фундаментальное недоразумение по пути equals и hashCode взаимодействовать. Эти два метода работают в сотрудничестве, а не заменяют друг друга. Более того, вы, похоже, неправильно понимаете, как эти два метода взаимодействуют с оператором ==: они этого не делают; оператор == проверяет идентификатор объекта, поэтому в вашей программе он вернет false, даже если вы правильно переопределяете hashCode и equals.

Вы должны всегда переопределять оба этих метода парами и вызывать equals для проверки равенства.

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

Необходимое количество: документация для hashCode и equals.

Смежные вопросы