Переопределение метода.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
Другие вопросы по тегам