Это кусок кода, который я использовал в книге SCJP. Я понимаю, что == сравнивает расположение памяти объектов, чтобы найти равенство, и .equals сравнивает хэш-код для определения равенства.Java confused about == в методе переопределенных равных
Мой вопрос в приведенном ниже фрагменте кода, в перекрытая равно метод сравним:
(((Moof)o).getMoofValue()) == this.getMoofValue()
в приведенном выше коде, имеет ли == сравнить расположение памяти строковое значение? Если это так, то оно должно быть ложным. Но он возвращает true. Как работает == здесь?
public class EqualsTest {
public static void main(String args[]){
Moof one = new Moof("a");
Moof two = new Moof("a");
if(one.equals(two)){
System.out.println("Equal");
}
else{
System.out.println("Not Equal");
}
}
}
public class Moof {
private String moofValue;
public Moof(String i){
this.moofValue = i;
}
public String getMoofValue(){
return this.moofValue;
}
public boolean equals(Object o){
if((o instanceof Moof) && (((Moof)o).getMoofValue()) == this.getMoofValue()){
return true;
}
return false;
}
}
для примитивов «==» сравнивает «свое значение» для не-примитивов «==» сравнивает ссылки ... здесь вы сравниваете 2 строки с «==», поэтому в основном вы сравниваете ссылки .. и BTW equals() сравнивает ссылки по умолчанию ... Он не сравнивает hashCode. – TheLostMind
'equals()' не "сравнивает хэш-код" ... он сравнивает все, что метод написан для сравнения. –
«.equals сравнивает хэш-код для определения равенства» - я был бы очень удивлен, увидев класс, который это делает. Даже в редких случаях, когда это действительно сработало, это было бы неэффективно. – user2357112