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()));