StringBuilder.equals Java

class strb
{

    static public void main(String...string)
    {
         StringBuilder s1 = new StringBuilder("Test");
         StringBuilder s2 = new StringBuilder("Test");

         System.out.println(s1);
         System.out.println(s2);
         System.out.println(s1==s2);
         System.out.println(s1.equals(s2)); //Line 1
         System.out.println(s1.toString()==s2.toString()); //Line 2
         if(s1.toString()==s2.toString())System.out.println("True"); //Line 3
    }

}

И вывод

Test
Test
false
false

Просто быстрый вопрос по .equals.

Независимо от содержимого объекта, .equals возвращает true, только если обе ссылки на объект указывают на один и тот же объект?


РЕДАКТИРОВАТЬ: Теперь я понимаю часть о .equals но почему строки 2 и 3 также не возвращают true?

РЕДАКТИРОВАТЬ: Я считаю, что == смотрит на адрес ссылочной переменной, и поэтому s1 и s2 не могут быть равны. Исправьте меня, если мое предположение не верно

Ответы

Ответ 1

Да, StringBuilder does not override Object.equals() function, что означает, что две ссылки на объекты не совпадают, и результат равен false.

Для StringBuilder вы можете использовать s1.toString().equals(s2.toString())

Для редактирования вы вызываете оператор == для двух разных объектов String. Оператор == вернет false, потому что объекты разные. Для сравнения строк необходимо использовать String.equals() или String.equalsIgnoreCase()

Это та же проблема, что у вас была раньше

Ответ 2

Реализация по умолчанию .equals для класса Object такая же, как вы упомянули.

Другие классы могут переопределить это поведение. StringBuilder не является одним из них.

String является одним из них, который переопределяет его, чтобы гарантировать, что представления String обоих объектов приводят к одной и той же последовательности символов. String API

Обратитесь к документации для конкретного объекта.

Ответ 3

Класс StringBuilder не предоставляет метод overriden equals(). Таким образом, когда этот метод вызывается в экземпляре StringBuilder, выполняется реализация класса Object метода, так как StringBuilder extends Object.

Исходным кодом для этого является

public boolean equals(Object obj) {
    return (this == obj);
}

Что просто сравнивает ссылочное равенство.

Ответ 4

для вашего первого ответа проверьте @abmitchell Ответ

И для вашего редактирования:

В Java String является объектом, и мы не можем сравнивать объекты на равенство значений, используя ==

== используется для сравнения значений примитивов или ссылок на объекты.

Для сравнения значений объектов мы используем equals() в Java

Ответ 5

Класс StringBuilder не имеет реализации метода equals() как в классе String.

Таким образом, он выполняет функциональность класса Object по умолчанию, которая снова проверяет только эквивалентность адресов, что в данном случае не одно и то же. так что печатает ложь.

Примечание 1: Вы также можете использовать оператор == для объектов, но он просто проверяет, являются ли адреса обоих объектов одинаковыми или нет.

Примечание 2: оператор == играет хорошую роль при сравнении двух объектов String, созданных в пуле строковых констант, чтобы выяснить, действительно ли он создает новый объект в пуле строковых констант или нет.

Ответ 6

Проверьте контракт метод equals:

он должен быть согласованным (если объекты не изменены, то он должен продолжать возвращать одно и то же значение).

Вот почему StringBuilder не переопределяет его независимо от его содержимого.

Давайте возьмем пример выше.

     StringBuilder s1 = new StringBuilder("Test");
     StringBuilder s2 = new StringBuilder("Test");

Возможно, вам ожидается, что s1.equals(s2) вернет true из-за текущих значений времени выполнения.

Но что делать, если вы измените добавить строку:

    s1.append("abc");

Тогда s1 и s2 будут иметь различное содержимое строки, а s1.equals(s2) как ожидается, будет false. Но это противоречит последовательности.

Ответ 7

Согласился с обоими вышеупомянутыми ответами, но стоит отметить, что на самом деле нужно сравнить содержимое, которое вы можете сделать:

System.out.println(s1.toString().equals(s2.toString())); //Line 1

Ответ 8

StringBuilder и StringBuffer не переопределяют функцию equals класса Object Но строка переопределяет метод equals. функция Object это

public boolean equals(Object obj) {
    return (this == obj);
    }

Вы могли бы написать свой код, как это.

System.out.println(s1.toString() == s2.toString());
System.out.println(s1.toString().equals(s2.toString()));