Как сравнить два объекта StringBuffer с помощью метода .equals()?

Следующий код не работал. Может ли кто-нибудь сказать мне, что не так со следующим кодом. По логике должно работать...

package assignments;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IsPalindrome {
public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(
                                      new InputStreamReader(System.in));
    System.out.println("Enter a Word:");
    StringBuffer sb1 = new StringBuffer(br.readLine());
    StringBuffer sb2 = new StringBuffer(sb1);
    sb1.reverse();

    if(sb2.equals(sb1))
        System.out.println("Palindrome");
    else
        System.out.println("Not a Palindrome");
}
}

person Praveen Kumar    schedule 14.06.2013    source источник
comment
Вы можете использовать StringBuilder вместо StringBuffer (если вы не обращаетесь к нему из нескольких потоков), так как это быстрее.   -  person Gabriel Negut    schedule 14.06.2013
comment
Это может ответить на ваш запрос stackoverflow.com/questions/2012305/   -  person Gaurav Goyal    schedule 14.06.2013
comment
StringBuffer не переопределяет equals(), унаследованное от Object, поэтому содержимое в StringBuffer не сравнивается только с их ссылкой.   -  person Sello    schedule 14.06.2013
comment
Если вы еще не знаете, вам следует прочитать документацию API, а не делать предположения о поведении методов. В документации StringBuffer говорится, что его метод equals унаследовано от Объекта.   -  person Patricia Shanahan    schedule 14.06.2013
comment
Пожалуйста, не используйте StringBuffer, если вы можете использовать StringBuilder. Этот класс устарел уже почти 10 лет. vanillajava.blogspot.com/2012/08/   -  person Peter Lawrey    schedule 14.06.2013
comment
Используйте метод equals() класса String, как показано ниже sb2.toString().equals(sb2.toString())   -  person Vishal    schedule 05.06.2017


Ответы (3)


Пытаться

sb1.toString().equals(sb2.toString());

потому что StringBuffer#toString< Метод /a> возвращает строковое значение данных, хранящихся внутри буфера:

Возвращает строку, представляющую данные в этой последовательности. Выделяется и инициализируется новый объект String, содержащий последовательность символов, представленную в данный момент этим объектом. Затем эта строка возвращается. Последующие изменения этой последовательности не влияют на содержимое строки.

person darijan    schedule 14.06.2013
comment
Спасибо @darijan, это сработало, но почему мы не можем напрямую сравнить два объекта строкового буфера? - person Praveen Kumar; 14.06.2013
comment
Ну, потому что метод equals не реализован таким образом для StringBuffers. Он возвращает true только тогда, когда StringBuffer сравнивается с самим собой. - person darijan; 14.06.2013
comment
@user1377586 user1377586 StringBuffer не имеет собственной реализации equals, поэтому вызов заканчивается реализацией Object, основанной на ссылке. - person Fritz; 14.06.2013

В классе StringBuffer метод equals не переопределяется, как в классе String. В StringBuffer он просто смотрит, совпадают ли ссылки. Поэтому вам сначала нужно преобразовать это в строку, а затем использовать метод equals.

Поэтому постарайтесь

sb1.toString().equals(sb2.toString());
person Dulanga    schedule 14.06.2013

Ты можешь написать

System.out.println("Enter a line:");
String line = br.readLine().replace(" ", ""); // palindromes can have spaces
String reverse = new StringBuilder(sb1).reverse().toString();

if(line.equals(reverse))
    System.out.print("Not a ");
System.out.println("Palindrome");
person Peter Lawrey    schedule 14.06.2013