Переопределение метода.equals() (== вернул true при сравнении строк)!
public class Employee {
private String firstName;
private String lastName;
private int age;
public Employee(String firstName, String lastName, int age) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public boolean equals(Employee s) {
if (this.firstName==s.firstName && this.lastName == s.lastName) { //Line 1
return true;
}
return false;
}
public static void main(String agrs[]) {
Employee e1 = new Employee("Jon", "Smith", 30);
Employee e2 = new Employee("Jon", "Smith", 35);
System.out.println(e1.equals(e2));
}
}
Строка 1 вернула истину при сравнении двух строк с оператором ==. Я думал, что "Джон" и "Смит" для e 1 и e2 будут иметь две разные ссылки (расположение в памяти).
Какая концепция заботится о том, чтобы "Джон" и "Смит" e 1 и e2 имели одинаковые ссылки?(Кэширование строк??! Или это просто совпадение?)
1 ответ
Решение
Это из-за интернирования строк. Строковые литералы "Jon" и "Smith" компилируются в одну строку и сохраняются компилятором в пуле строковых констант. Следовательно, в этом случае оба конструктора будут ссылаться на один и тот же экземпляр.
Вы можете увидеть разницу, используя ниже:
Employee e1 = new Employee("Jon", "Smith", 30);
Employee e2 = new Employee("Jon", "Smith", 35);
Employee e3 = new Employee(new String("Jon"), new String("Smith"), 35);
System.out.println(e1.equals(e2)); // true
System.out.println(e1.equals(e3)); // false