Что такое эффективный способ сравнения объектов StringBuilder

У меня есть два объекта StringBuilder, мне нужно сравнить их в Java. Один способ, который я знаю, я могу сделать, это

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

но это означает, что я создаю два объекта String, есть ли лучший способ сравнить объекты StringBuilder. Вероятно, что-то, где вам не нужно создавать дополнительные объекты?

 Jeffrey13 июн. 2012 г., 04:25
Я удивлен, чтоStringBuilder не объявляет свое собственноеequals метод.
 user17780013 июн. 2012 г., 04:31
то, что вы делаете, - лучший способ сделать это, за исключением очень большогоString объекты.

Ответы на вопрос(4)

contentEquals() Метод Струны.

StringBuilder s = new StringBuilder("abc");
StringBuilder t = new StringBuilder("def");

if(s.contentEquals(new String(t)) {
    System.out.println("Same");
}
 07 сент. 2017 г., 06:17
s должен быть String, а не StringBuilder.

Начиная с Java 11,StringBuilder инвентарьComparableтак что вы можете использоватьcompareTo Метод проверки на равенство:

System.out.println(sb1.compareTo(sb2) == 0);

чтобы получить строковое представление для обоих объектов, а затем используйте .equals () для сравнения объектов. Таким образом вызывается метод equals () из класса String, который сравнивает строковое значение объектов вместо сравнения расположения в памяти.

StringBuilder a= new StringBuilder("HELLO JAVA");
StringBuilder b= new StringBuilder("HELLO JAVA");
if (a.toString().equals(b.toString())){
System.out.println("Objects are equal");
}
 30 нояб. 2016 г., 18:58
Но это неэффективно, так как вы создаете новый экземпляр String.
Решение Вопроса

StringBuilder наследуетсяequals() отjava.lang.Object, и как таковойStringBuilder.equals() возвращает true, только если передан тот же объект, что и аргумент. Оно делаетnot сравнить содержание двухStringBuilders!

Если вы посмотрите на источник, вы придете к выводу, что наиболее эффективным сравнением (которое не связано с созданием каких-либо новых объектов) было бы сравнение.length() возвращаемые значения, а затем, если они совпадают, сравнивают возвращаемые значенияcharAt(i) за каждого персонажа.

 13 июн. 2012 г., 04:21
Это именно то, что делает sb1.equals (sb2).
 13 июн. 2012 г., 04:49
FYI,charAt(i) тонкая фанера (с проверкой границ параметров)value[i], гдеvalue этоchar[] удерживая текущую строку, так что да - это самый быстрый способ. И могу добавить, что отстает то, что в 2012 году мы все должны реализовать это, а не находиться внутриStringBuilder класс с жесткой петлей вкл. Разве не Apache Commons статический метод, который делает это?
 13 июн. 2012 г., 04:29
@jim - Как только тебя укусило что-то подобное, ты никогда не забудешь,and you make it your life's work to save others from the same torment!
 13 июн. 2012 г., 04:23
Нет, это абсолютно, совершенно, полностьюDOES NOT.
 13 июн. 2012 г., 04:28
@jjm Никогда не думай, что чей-то другой код был написан разумно;)

Ваш ответ на вопрос