← Назад к вопросам

Что такое String Pool?

2.2 Middle🔥 91 комментариев
#JVM и память

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

String Pool в Java JVM

String Pool - это специальная область памяти в JVM, где хранятся уникальные строковые значения. Это один из самых важных механизмов оптимизации памяти в Java.

Основная идея

Если в приложении много одинаковых строк, нет смысла хранить их копии в памяти. String Pool хранит только один экземпляр каждой уникальной строки, а остальные ссылаются на него.

Как это работает

val str1 = "hello" val str2 = "hello"

println(str1 === str2)  // true

Оба str1 и str2 указывают на ОДИН объект в памяти благодаря String Pool.

С конструктором

val str1 = "hello" val str2 = String("hello")

println(str1 === str2)  // false

Когда используешь конструктор String(), создаётся новый объект в heap, а не берётся из pool.

intern() метод

Можешь вручную добавить строку в pool:

val str1 = "hello" val str2 = String("hello") val str3 = str2.intern()

println(str1 === str3)  // true

intern() возвращает ссылку на строку из String Pool.

Где находится String Pool

В Java 7+ String Pool находится в heap. Раньше (Java 6 и ниже) был в PermGen.

Это улучшило управление памятью потому что heap имеет лучший GC.

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

String Pool даёт:
  • Экономия памяти - дубликаты не хранятся
  • Быстрое сравнение - можно использовать === (хотя не рекомендуется)
  • Автоматическую оптимизацию

Когда String Pool особенно важен

  1. Константные строки в коде (enum, keys)
  2. Строки из XML/JSON
  3. Enum значения
  4. Строки в switch-case

Важный момент: == vs ===

Не полагайся на String Pool для сравнения строк!

val userInput = readInput()

println(userInput === "admin")  // Может быть true или false

Это потому что userInput может быть создана через конструктор.

Правильный способ:

println(userInput == "admin")  // Всегда работает правильно

Используй == для сравнения содержимого строк.

Как String Pool работает под капотом

String Pool использует HashMap для быстрого поиска:
  1. При добавлении строки вычисляется hashCode()
  2. По хешу ищется в HashMap
  3. Если есть - возвращается существующая ссылка
  4. Если нет - добавляется новая

Это обеспечивает O(1) время поиска.

Примеры

Компилятор автоматически ищет в pool: val a = "hello" val b = "hello" // Из pool val c = "hel" + "lo" // Из pool (может быть оптимизировано компилятором)

val d = String("hello") // Новый объект, не из pool val e = d.intern() // Теперь из pool

Резюме

String Pool - это оптимизация памяти для хранения уникальных строк. Компилятор и JVM автоматически её используют. Главное правило - используй == для сравнения строк, а не === , потому что !== не гарантирует разные значения.
Что такое String Pool? | PrepBro