Какова логика == возврата false [toString()], когда две ссылочные переменные ссылаются на один и тот же объект с одинаковым хэш-кодом? [дубликат]
В чем логика
==
возвращает false, когда две ссылочные переменные ссылаются на один и тот же объект с одинаковыми значениями хэш-кода?
public class One {
public static void main(String[] args) {
One o = new One();
One o1 = o;
System.out.println(o.toString());
System.out.println(o1.toString());
System.out.println(o.hashCode());
System.out.println(o1.hashCode());
// Why does it print false ?
System.out.println(o.toString()==o1.toString()); // false
System.out.println(o.hashCode()==o1.hashCode()); // true
System.out.println(o.equals(o1)); // true
System.out.println(o.toString().hashCode()==o.toString().hashCode()); // true
}
}
2 ответа
Линия с
System.out.println(o.toString()==o1.toString()); // false
имеет . Каждый
toString()
создает новый объект String, который представляет собой разные объекты, которые имеют свои собственные ячейки памяти. Таким образом, фактически проверяется адреса памяти между этими новыми объектами String.
Всегда сравнивайте строки с String#equals
, не со
==
.
==
Знак проверяет адреса памяти сравниваемых объектов. В твоем случае,
toString()
метод создает два разных
String
объекты хранятся в двух разных местах. Вот почему вы получаете
false
когда вы пытаетесь их сравнить.
С другой стороны,
equals()
проверяет равенство содержимого объектов. Для ваших собственных типов данных вы должны переопределить этот метод, чтобы использовать его.
hashCode
это своего рода уникальный идентификационный номер содержимого объектов. То есть, равные друг другу объекты должны возвращать один и тот же хэш-код.