Строки в Java не являются примитивным типом данных, как например int или double. Первым делом String – это класс, прописанный в пакете java.lang и представляющий строковый набор символов. String — наиболее широко используемый класс в Java. Трудно себе представить приложение, не используемое строки.
Особенности класса String в Java заключаются в том, что строки это неизменяемый (immutable) и финализированный тип данных, и возможности хранения всех объектов класса String в пуле строк. Так же к особенностям можно отнести возможность получения объектов класса String используя двойные кавычки и перегруженный оператор “+” для сцепления(конкатенации) строк.
Так почему же строки в Java неизменяемые? При ответе на этот вопрос также становится понятно, являются ли строки в Java потокобезопасными, и почему строка является популярным ключем в HashMap?
У неизменности строк есть ряд неоспоримых преимуществ:
- Строковый пул (String pool) возможен только благодаря тому, что строки в Java неизменяемы. Виртуальная машина имеет возможность сохранить много места в памяти (heap space) т.к. разные строковые переменные указывают на одну переменную в пуле. При изменяемости строк было бы невозможно реализовать интернирование, поскольку если какая-либо переменная изменит значение, это отразится также и на остальных переменных, ссылающихся на эту строку.
- Изменяемость строк несло бы в себе потенциальную угрозу безопасности приложения. Поскольку в Java строки используются для передачи параметров для авторизации, открытия файлов и т.д. — неизменяемость позволяет избежать проблем с доступом.
- Так как строка неизменяемая то, она безопасна для много поточности и один экземпляр строки может быть совместно использован различными потоками. Это позволяет избежать синхронизации для потокобезопасности. Таким образом, строки в Java полностью потокобезопасны.
- Поскольку строка неизменная, её hashcode кэшируется в момент создания и нет никакой необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в Map и его обработка будет быстрее, чем других ключей HashMap. Поэтому строка наиболее часто используется в качестве ключа HashMap.
Если резюмировать вышесказанное, то получаем, что основные причины неизменяемости String в Java это безопасность и наличие пула строк (String pool).
- можно передавать строку между потоками не опасаясь, что она будет изменена
- отсутствуют проблемы с синхронизацией потоков
- отсутствие проблем с утечкой памяти
- отсутствие проблем с доступом и безопасностью при использовании строк для передачи параметров авторизации, открытия файлов и т.д.
- кэширование hashcode
- Экономия памяти при использовании пула строк для хранения повторяющихся строк.
Если нужно изменять строки то, есть StringBuffer/StringBuilder.