Открыть сервис

Concat: конкатенация строк и массивов

Concat (от англ. concatenation — сцепление, соединение) — в программировании операция объединения двух или более последовательностей данных (строк, массивов, списков) в одну результирующую последовательность, при которой элементы исходных последовательностей располагаются друг за другом в порядке их перечисления. Термин также используется для обозначения одноимённых методов и функций в различных языках программирования и библиотеках, реализующих данную операцию.

Суть операции

Конкатенация является одной из базовых операций над составными типами данных. В отличие от арифметического сложения, при конкатенации не происходит преобразования типов или вычисления суммы — элементы исходных данных просто копируются в новую последовательность в строгом порядке следования аргументов. Например, конкатенация строк «foo» и «bar» даёт строку «foobar», а конкатенация массивов [1, 2] и [3, 4] — массив [1, 2, 3, 4].

Важным свойством операции является её ассоциативность: результат объединения не зависит от порядка применения операции к нескольким аргументам, если исходный порядок самих аргументов сохраняется. При этом операция, как правило, не является коммутативной — изменение порядка аргументов меняет результат.

Конкатенация строк

В большинстве языков программирования для строк определён оператор или функция конкатенации. В языках семейства C (C++, Java, C#, JavaScript, PHP) используется бинарный оператор +, который при применении к строкам выполняет их сцепление. В Python и Ruby аналогичную роль выполняет оператор +, в то время как в языках с поддержкой интерполяции (например, в JavaScript с шаблонными литералами) конкатенация часто заменяется подстановкой значений в строку.

В языках, где строки являются неизменяемыми (immutable) объектами, — Java, C#, Python, JavaScript — каждая операция конкатенации создаёт новую строку в памяти. Многократное последовательное объединение большого числа строк в цикле приводит к квадратичной сложности по памяти и времени из-за постоянного копирования промежуточных результатов. Для решения этой проблемы в таких языках предусмотрены специализированные классы-накопители: StringBuilder в Java и C#, StringBuffer в Java, io.StringIO в Python, массивы с последующим join в JavaScript.

В языках с изменяемыми строками (C, C++ с std::string, Ruby) конкатенация может выполняться «на месте» без создания нового объекта, что эффективнее при циклическом накоплении.

Методы concat в языках программирования

JavaScript

В JavaScript метод concat() определён для трёх типов: Array.prototype.concat(), String.prototype.concat() и TypedArray.prototype.concat(). Метод массива concat объединяет вызывающий массив с одним или несколькими переданными массивами или значениями, возвращая новый массив. Исходные массивы при этом не изменяются. Если аргумент является массивом, его элементы добавляются по отдельности; если значением — добавляется само значение. Метод выполняет мелкое (shallow) копирование: вложенные массивы и объекты передаются по ссылке.

Пример использования: ``javascript const arr1 = [1, 2]; const arr2 = [3, 4]; const result = arr1.concat(arr2); // [1, 2, 3, 4] ``

Метод String.prototype.concat() объединяет строку, для которой вызван, с переданными строками и возвращает новую строку. На практике его использование менее распространено, чем оператор +, из-за меньшей производительности и худшей читаемости.

Python

В Python нет отдельного метода concat для стандартных типов. Конкатенация списков выполняется оператором + или методом extend() (для изменения списка на месте), строк — оператором + или методом join() для последовательности строк. В модуле operator присутствует функция concat(a, b), эквивалентная операции a + b для строк и списков.

Java

В Java метод concat() определён в классе String и принимает один строковый аргумент, возвращая новую строку. Для объединения более двух строк чаще используется String.join() или StringBuilder. В интерфейсе Stream (Java 8+) существует метод Stream.concat(), объединяющий два потока в один. Метод concat() также присутствует в классе Path (объединение путей файловой системы) и в классе ByteBuffer.

PHP

В PHP конкатенация строк выполняется оператором . (точка), а не +. Для массивов существует функция array_merge(), выполняющая слияние, и оператор + для объединения с сохранением ключей первого массива. Функция implode() соединяет элементы массива в строку с разделителем.

SQL

В языке SQL конкатенация строк выполняется оператором || (стандарт ISO/IEC 9075) либо функцией CONCAT(). В Microsoft SQL Server и MySQL оператор || по умолчанию не работает как конкатенация (в MySQL — если не включён режим PIPES_AS_CONCAT), поэтому используется функция CONCAT(). В PostgreSQL поддерживаются оба варианта. Функция CONCAT() в отличие от оператора || автоматически игнорирует значения NULL, тогда как оператор при наличии NULL возвращает NULL.

Функциональные языки

В функциональных языках конкатенация списков является фундаментальной операцией. В Haskell она обозначается оператором ++, в Erlang — ++, в Elixir++ для списков и <> для бинарных данных (строк). В Lisp и Scheme для объединения списков используется функция append. В языках семейства ML (OCaml, F#) — оператор @. В Scala для строк и коллекций определён метод concat, а также оператор ++.

Конкатенация в базах данных и файловых системах

В базах данных конкатенация применяется не только в SQL-запросах, но и при работе с индексами и ключами. В ряде СУБД конкатенация нескольких столбцов используется для создания составных индексов или для формирования вычисляемых полей.

В файловых системах и путях к ресурсам конкатенация строк применяется для сборки полного пути из каталога и имени файла. При этом важно учитывать разделители компонентов пути (/ в Unix-подобных системах, \ в Windows). Специализированные функции, такие как Path.Combine() в .NET или os.path.join() в Python, автоматически подставляют корректный разделитель.

Производительность и альтернативы

При работе с большими объёмами данных прямое многократное применение конкатенации строк может быть неэффективным. Альтернативными подходами являются:

  • использование накопителей (StringBuilder, StringBuffer);
  • сборка строк из массива фрагментов с последующим объединением (join);
  • использование потоковой записи в буфер или файл;
  • шаблонные строки (template literals) с интерполяцией.

Для массивов вместо многократной конкатенации часто применяется метод push() с последующим копированием или использование структур данных с поддержкой эффективного сцепления, например, персистентных списков в функциональных языках.

Смежные понятия

Конкатенацию не следует путать с интерполяцией строк (подстановкой значений переменных в шаблон), слиянием (merge) массивов с преобразованием ключей, а также с операцией добавления элемента в конец (append). В теории формальных языков конкатенация строк является основной операцией при определении формальных грамматик и регулярных выражений.

Загружаем BFOmetr…