Как мы можем обрезать значение StringBuilder
без накладных расходов, вызванных использованием StringBuilder.toString().trim()
и после создания нового экземпляра строки StringBuilder?
Как обрезать строку StringBuilder?
Ответ 1
Почему у StringBuilder нет метода trim()
- Потому что так оно и было спроектировано. Попробуйте спросить дизайнеров.
- Потому что его не так много.
- Поскольку строка
trim()
семантика и подпись плохой подходит для изменяемых строк, хотя это спорно.
В любом случае ответ не имеет отношения к решению вашей проблемы.
и как мы можем обрезать значение StringBuilder?
Самый простой способ - использовать StringBuilder.toString().trim()
...
Я не хочу использовать StringBuilder.toString(). trim().
В этом случае вам нужно сделать то, что trim()
делает под обложками: совпадение и удаление верхнего и заднего пробелов. Поскольку у API-интерфейса StringBuilder нет поддержки регулярных выражений, вам нужно сделать это сложным образом; то есть путем итерации символов спереди вперед и конца назад, чтобы увидеть, какие символы нужно удалить и т.д.
Вы уверены, что не хотите, чтобы это было легко? Если нет, то этот Q & A имеет некоторые примеры реализаций, анализа, бенчмаркинга и т.д.:
На самом деле я в цикле, где мне нужно сравнить эту строку StringBuilder со многими другими значениями, поэтому, если я вызову StringBuilder.toString(). trim() каждый раз, он создаст новый экземпляр, и я не хочу каждый раз создавайте новый объект String.
Флип-сторона заключается в том, что удаление символов с начала StringBuilder влечет за собой копирование всех остальных символов.
Возможно, вам лучше было бы превратить полный StringBuilder в String для начала, тогда, когда вы будете использовать trim()
и substring()
и т.п., вы не будете копировать символы. (Эти методы работают путем создания новой строки, которая разделяет массив подстановки исходной строки... так что вы только копируете информацию управления строкой. UPDATE. В Java 7 они изменили поведение trim
и substring
, так что они использовали конструктор String, который копирует подмассив массива подкачки.)
Ответ 2
Я не знаю, чего вы пытаетесь достичь, но если вы беспокоитесь о производительности, возможно, вы можете выполнить обрезку, поскольку вы добавляете к StringBuilder.
stringbuilder.append(string.trim())
Ответ 3
Почему у StringBuilder нет метода trim()?
Hmm.. StringBuilder
похож на String
, просто небольшое различие, которое можно изменить после создания else, это то же самое, что и строка.
Как указано в ссылке выше, основными операциями в StringBuilder являются методы добавления и вставки. Я предполагаю, что им предлагается поддерживать изменяемые строки, так же как и с StringBuffer
. И если вы можете сделать все, сделав небольшой вызов другому методу, а затем желаемому методу, то в чем дело. Почему вы хотите, чтобы одна реализация выполнялась в нескольких классах.
Как мы можем обрезать значение StringBuilder?
Как говорят другие stringBuilder.toString().trim();
Я не хочу использовать
StringBuilder.toString().trim()
.
Хм... вопрос выбора, любая конкретная причина для этого?
Ответ 4
Используйте StringBuilder.toString().trim()
, но сохраните его в переменной.
Например:
String myTrimmedString = myStringBuilder.toString().trim();
У него нет метода trim()
, потому что очень просто и несколько предпочтительнее использовать неизменяемые объекты. Представьте, что один поток обрезает StringBuilder
, а другой добавляет к нему. Представьте себе ошибки и странности, которые могут возникнуть в вашем коде.
Ответ 5
Вы можете преобразовать экземпляр StringBuilder
в string
, который позже можно обрезать.
sb.toString().trim();//sb is stringBuilder Instance.