Programming

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

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

Что такое Конкатенация

Конкатенация (от лат. concatenatio — сцепление) — операция склеивания двух последовательностей в одну. Результат содержит элементы первой, за которыми идут элементы второй, порядок сохраняется.

Конкатенация строк — самый частый случай: "cloud" + "compute" даёт "cloudcompute". Никакого разделителя не добавляется: пробел нужно ставить явно, это источник классической ошибки "Привет" + "мир""Приветмир".

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

Ключевые свойства

  • Ассоциативна: (a + b) + c равно a + (b + c).
  • Не коммутативна: "ab" + "cd""cd" + "ab". Порядок операндов важен.
  • Нейтральный элемент — пустая строка: s + "" == s.

Как это выглядит в разных языках

Язык Оператор Пример
Python + "a" + "b"
JavaScript + 'a' + 'b'
Java + "a" + "b"
PHP . 'a' . 'b'
SQL (стандарт) || 'a' || 'b'
MySQL CONCAT() CONCAT('a', 'b')
Bash рядом s="$a$b"

Разнобой с SQL стоит запомнить: в PostgreSQL и SQLite работает ||, в MySQL по умолчанию || — это логическое ИЛИ, и склеивать нужно через CONCAT().

Строки неизменяемы — отсюда главная ловушка

В Python, Java, JavaScript и C# строки immutable: a + b не дописывает в конец, а создаёт новый объект и копирует туда оба операнда. Конкатенация в цикле поэтому квадратична — на каждой итерации копируется всё накопленное:

# плохо: O(n²) — каждый += копирует всю строку заново
result = ""
for row in rows:
    result += row + "\n"

# хорошо: O(n) — один проход, одна аллокация
result = "\n".join(rows) + "\n"

На тысяче строк разницу не заметно, на миллионе — это секунды против миллисекунд. Правило простое: склеиваете в цикле — используйте join (Python), StringBuilder (Java), strings.Builder (Go), array.join() (JavaScript).

Что использовать вместо +

Для вставки значений в текст конкатенация проигрывает интерполяции — та короче и не требует ручного приведения типов:

name, count = "sales", 42
"Отчёт " + name + ": " + str(count) + " строк"   # ручной str(), легко забыть
f"Отчёт {name}: {count} строк"                   # f-строка, читается лучше
`Отчёт ${name}: ${count} строк`   // шаблонная строка

Отдельный случай — SQL. Собирать запрос конкатенацией нельзя: это прямой путь к SQL-инъекции.

# опасно: значение попадает в текст запроса
cur.execute("SELECT * FROM users WHERE email = '" + email + "'")

# правильно: параметризованный запрос, драйвер экранирует сам
cur.execute("SELECT * FROM users WHERE email = %s", (email,))

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

[1, 2] + [3, 4]        # [1, 2, 3, 4] — списки
(1, 2) + (3,)          # (1, 2, 3) — кортежи
b"ab" + b"cd"          # b'abcd' — байты

В SQL конкатенацией по сути является UNION ALL — он склеивает результаты двух выборок в одну. В NumPy и PyTorch есть concatenate и cat, соединяющие массивы вдоль выбранной оси.

Складывать при этом можно только совместимые типы. "1" + 1 в Python — ошибка, а в JavaScript даст "11": там + при строке приводит второй операнд к строке. Это различие — следствие строгой и слабой типизации.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер