Java String против строкового буфера

У меня есть следующие строки из кода Java

{        
         String str1=new String("Vivek");
         String str2=new String("Vivek");
         StringBuffer str3=new StringBuffer("Vivek");
         StringBuffer str4=new StringBuffer("Vivek");
         System.out.println(str1.equals(str2));
         System.out.println(str3.equals(str4));
}

Теперь я получаю вывод следующим образом

    True
    False

Я не могу понять, почему он печатает true для объекта String и false для объектов StringBuffer? Имеет ли это какое-то отношение к изменчивости объектов?


person Vivek Patil Linksys3966    schedule 08.05.2014    source источник
comment
Ты волшебник! Это не может скомпилироваться. Вы имели в виду StringBuffer str3=new StringBuffer("Vivek");?   -  person Alexis C.    schedule 08.05.2014
comment
@ZouZou после небольшого редактирования: ideone.com/xUJgnG   -  person Ivaylo Strandjev    schedule 08.05.2014
comment
Класс StringBuffer просто не переопределяет равенство. Поскольку вы создаете два совершенно новых экземпляра, он возвращает false.   -  person Alexis C.    schedule 08.05.2014
comment
StringBuffer не переопределяет метод equals из Object.   -  person Omoro    schedule 08.05.2014
comment
str3.equals(str4) эквивалентно object.equals(object)   -  person Braj    schedule 08.05.2014
comment
Не связанное с этим примечание: если вам не нужна потокобезопасность StringBuffer, используйте StringBuilder.   -  person Puce    schedule 08.05.2014


Ответы (2)


StringBuffer не переопределяет equals, поэтому вызывает метод суперкласса Object. Если вы хотите сравнить контент, используйте метод toString

System.out.println(str3.toString().equals(str4.toString()));

Примечание. Так как Java 1.5 StringBuffer был заменен StringBuilder в качестве альтернативы без потоков

person Reimeus    schedule 08.05.2014
comment
Другими словами, они не были созданы для сравнения. - person biziclop; 08.05.2014

Поскольку equals в классе String был перезаписан для сравнения содержимого, в то время как equals в классе StringBuffer остался унаследованным от класса Object, который сравнивает адрес.

См. там javadoc для обоих, и вы поймете больше.

In String.equals:

Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.

Overrides: equals(...) in Object
Parameters:
anObject The object to compare this String against
Returns:
true if the given object represents a String equivalent to this string, false otherwise
See Also:
compareTo(String)
equalsIgnoreCase(String)

Вы можете использовать:

str3.toString().equals(str4);
person taper    schedule 08.05.2014
comment
Да... понял... так что дело в том, что класс String переопределяет методы equlas из класса Object, а StringBuffer - нет... - person Vivek Patil Linksys3966; 08.05.2014