Элегантный способ объединения строк в Java

задняя часть

задний план

Конкатенация строк часто используется как в бизнесе, так и при написании алгоритмов. Для Java существует множество способов конкатенации строк, в чем между ними разница и какой из них лучше подходит для разных предприятий.

image.png

Основной принцип String

При обсуждении конкатенации строк вам в первую очередь нужно знать основные принципы String.

Здесь мы обсуждаем только ситуацию после jdk1.8, посмотрите на структуру

private final byte[] value;

Эта строка кода уже говорит о многом. Строки по сути являются неизменяемыми массивами байтов. Поскольку это неизменяемо, сращивание его на самом деле создает несколько объектов, поэтому сращивание строк не рекомендуется. Но неизменяемость также имеет много преимуществ, таких как безопасность потоков, наличие пула строковых буферов для повторного использования строк и т. д.

метод сращивания

Классический, но иногда неэлегантный +

String a = "123";
String b = "456";
String c = a + b;

Строка c — это строка, объединенная с помощью ab, «123456».

Код, декомпилированный из этого кода,

String c = (new StringBuilder()).append(a).append(b).toString();
​

могу видеть это+является синтаксическим сахаром Java, на самом деле он вызываетStringBuilder, объединение через append(). Давайте поговорим о StringBuilder позже, а сначала поговорим о преимуществах и недостатках этого использования.

преимущество

"+", самый большой плюс в том, чтолаконичный. Если две строки нужно соединить встык, знак + обязательно будет лучшим способом его использования.

недостаток

Если говорить о недостатках, то их больше. Простота также является его самой большой слабостью, то есть недостаточногибкий.

бизнес один

Есть список строк, мне нужно их соединить, что мне делать?

for(String tmp:list){
    s += tmp;
}

Аккуратная партия, но он скрывает большую проблему!

image.png

Как упоминалось выше, этот метод объединения на самом деле осуществляется через метод добавления StringBuilder. Вам не нужно знать его принцип, вам просто нужно знать, что каждый раз, когда он зацикливается, он будет создавать новый объект StringBuilder. Накладные расходы на создание объектов очень велики, если в списке десятки тысяч, то накладные расходы памяти и времени неприемлемы!

Итак, спецификация Alibaba гласит:

img

На первый взгляд рекомендуется, но на самом деле этозапретить. Написание алгоритма отнимет много времени и приведет к провалу, а бизнес еще и увеличит накладные расходы без причины из-за этого метода, который относится к коду, который лидер хочет убить, когда увидит его.

дело два

Всем привет, меня зовут ХХ, я учусь в школе ХХХ, мое хобби ХХХ.

Классический шаблон, мне нужно заменить ХХХ посередине как параметр контроллера, что делать?

String s = "大家好,我叫"+name+"我是来自"+school+"学校的大"+num+“学生,我的爱好是”+aihao;

принадлежатьПолезно, но очень некрасивокод. Если другим интерфейсам также нужен этот шаблон, нужно ли везде копировать это предложение? Если бы я изменил это, мне пришлось бы изменить весь код.

Всемогущий StringBuilder

Сначала познакомьтесь с принципом StringBuilder. Объединение строк легко понять как массив.StringBuilder чем-то похож на ArrayList, изменяемый массив.

    /**
     * The value is used for character storage.
     */
    char[] value;

разницы нетокончательная модификация, при достижении порога выполняется операция расширения. Метод добавления заключается в вставке в обратном направлении.

Тогда вы можете решить вышеуказанную бизнес-задачу.

StringBuilder sb = new StringBuilder();
for(String tmp:list){
    sb.append(tmp);
}
String s = sb.tostring();

По сравнению с приведенным выше, создается только один объект StringBuilder, что снижает накладные расходы на создание цикла.

Поточно-ориентированный StringBuffer

По сравнению со StringBuilder, StringBuffer имеет преимущество в безопасности потоков за счет блокировки. При этом эффективность немного ниже, чем у StringBuilder.

гибкий String.format()

Технически это должно называться форматированием, но его также можно использовать для сращивания.

Те, кто знаком с языком C, должны быть в состоянии понять, я приведу пример здесь

String msg = String.format(“我是%s小学的学生,我爱吃%s”,"阳光","屎");
//输出 我是阳光小学的学生,我爱吃屎

Используйте цепочку строк вместо %s для создания нужной строки. Мало того, что вы можете сращивать струны, вы можете посмотреть на картинку ниже (украденная картинка, не все проверено, не ищите меня, если это неправильно)

类型

Таким образом, решается вторая проблема бизнеса.Отложите соответствующую позицию, написав перечисление или константную строку, и используйте String.format(), чтобы соединить ее, когда вы ее используете..

немного зелени

Почему я говорю, что он зеленый, то есть я не нашел в нем никаких достоинств.

String s = "123".concat("456");
//结果等价于
String s = "123" + "456";

Принцип метода concat заключается в копировании предыдущего содержимого и записи нового содержимого после расширения массива, что несколько похоже на нижний слой StringBuilder.

Однако по сравнению со знаком «+» он не удобен и не эффективен. В условиях циклической склейки строк будет небольшое преимущество в эффективности, но такая ситуация вообще не допускается, так что concat очень безвкусен.

JDK1.8 элегантное письмо

Только что упомянутое решение для бизнеса 1 можно реализовать с помощью простого StringBuilder, но для бизнес-кода оно слишком многословно.

Jdk1.8 дает элегантный ответ

String s = String.join("_", list);

С помощью одной строки кода строки в списке можно объединить вместе с помощью «_».

Классическая гуава

Guava — хороший партнер для наших сырых программистов, поэтому здесь нет необходимости говорить больше. То, с чем мы чаще всего сталкиваемся, на самом деле является локальным кешем guava и строковыми операциями.

String result = Joiner.on(",").join(list);

Это также краткое предложение, но по сравнению с нативным строковым методом jdk у него есть некоторые другие особенности. Например, нулевые массивы можно пропустить или заменить и т. д. Функционал немного богаче, чем у jdk. В обычных веб-проектах есть зависимости от Guava, и это очень удобно в использовании.

Суммировать

Эта статья посвящена написанию кода, а именно тому, как писать лаконичный и эффективный код. Просто не делайте мусорный код, который вы пишете, отвратительным для коллеги, который берет на себя управление.

image.png