Есть несколько преимуществ в неизменности строк:
✔️ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в Heap, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку.
✔️ Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения.
✔️ Неизменяемость позволяет избежать синхронизации: строки безопасны для многопоточности и один экземпляр строки может быть совместно использован различными потоками.
✔️ Строки используются classloader и неизменность обеспечивает правильность загрузки класса.
✔️ Поскольку строка неизменяемая, её hashCode() кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap т.к. его обработка происходит быстрее.
#java #string #immutable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
Для получения неизменяемого варианта коллекции, в классе Collections есть соответствующие методы:
unmodifiableCollection
unmodifiableSequencedCollection
unmodifiableSet
unmodifiableSequencedSet
unmodifiableSortedSet
unmodifiableNavigableSet
unmodifiableList
unmodifiableMap
unmodifiableSequencedMap
unmodifiableSortedMap
unmodifiableNavigableMap
Поскольку неизменяемые коллекции нельзя изменить, разработчики могут быть уверены, что состояние коллекции не будет неожиданно изменено в других частях программы.
В некоторых случаях неизменяемые коллекции могут повышать производительность, так как операции над такими коллекциями не требуют блокировок и синхронизации.
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
List<String> unmodifiableList = Collections.unmodifiableList(list);
// Попытка изменить unmodifiableList приведет к UnsupportedOperationException
// unmodifiableList.remove("B");
#java #collections #immutable #unmodifiable
Please open Telegram to view this post
VIEW IN TELEGRAM
👌6👍4🔥2
Неизменяемые коллекции обеспечивают безопасность от случайных изменений данных, что особенно полезно в многопоточных приложениях или когда нужно гарантировать, что данные не будут изменены.
Вместо того чтобы создавать обычные коллекции и вручную делать их неизменяемыми с помощью метода
Collections.unmodifiableList(), теперь можно легко создать неизменяемую коллекцию с помощью новых фабричных методов.Пример создания неизменяемого списка:
List<String> names = List.of("Иван", "Мария", "Анна");
Пример создания неизменяемого множества:
Set<String> items = Set.of("Яблоко", "Груша", "Банан");
Попытка изменить такую коллекцию (например,
names.add("Петр")) приведёт к исключению UnsupportedOperationException.Использование неизменяемых коллекций помогает избежать ошибок, связанных с нежелательными изменениями, и улучшает безопасность данных.
#java #Immutable #Unmodifiable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
💡 Immutable Objects: зачем они нужны и как их создавать
Неизменяемые объекты (Immutable Objects) — это объекты, состояние которых невозможно изменить после создания. Они широко используются в Java для обеспечения безопасности, удобства работы в многопоточной среде и упрощения кода.
🔍 Зачем использовать Immutable объекты?
1️⃣ Безопасность данных: их невозможно изменить, что предотвращает случайное или преднамеренное изменение состояния.
2️⃣ Многопоточность: безопасны для использования без синхронизации.
3️⃣ Простота: отсутствует необходимость отслеживать изменения или управлять состоянием.
📌 Как создать Immutable объект:
1️⃣ Сделайте класс
2️⃣ Объявите все поля
3️⃣ Исключите сеттеры.
4️⃣ Предоставьте только геттеры (без возможности изменения данных).
5️⃣ Обеспечьте глубокое копирование для изменяемых полей.
📌 Пример Immutable класса:
🔗 Особенности реализации:
1️⃣ Класс
2️⃣ Поля
3️⃣ Нет методов для изменения полей (сеттеров).
📌 Работа с изменяемыми полями:
Если ваш класс содержит изменяемые объекты, возвращайте их копию или неизменяемую обёртку:
💡В Java есть встроенные immutable классы, такие как
#Java #Immutable
Неизменяемые объекты (Immutable Objects) — это объекты, состояние которых невозможно изменить после создания. Они широко используются в Java для обеспечения безопасности, удобства работы в многопоточной среде и упрощения кода.
🔍 Зачем использовать Immutable объекты?
1️⃣ Безопасность данных: их невозможно изменить, что предотвращает случайное или преднамеренное изменение состояния.
2️⃣ Многопоточность: безопасны для использования без синхронизации.
3️⃣ Простота: отсутствует необходимость отслеживать изменения или управлять состоянием.
📌 Как создать Immutable объект:
1️⃣ Сделайте класс
final. 2️⃣ Объявите все поля
private и final. 3️⃣ Исключите сеттеры.
4️⃣ Предоставьте только геттеры (без возможности изменения данных).
5️⃣ Обеспечьте глубокое копирование для изменяемых полей.
📌 Пример Immutable класса:
public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
🔗 Особенности реализации:
1️⃣ Класс
ImmutablePerson нельзя унаследовать (final). 2️⃣ Поля
name и age нельзя изменить после инициализации. 3️⃣ Нет методов для изменения полей (сеттеров).
📌 Работа с изменяемыми полями:
Если ваш класс содержит изменяемые объекты, возвращайте их копию или неизменяемую обёртку:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class ImmutableClass {
private final List<String> items;
public ImmutableClass(List<String> items) {
this.items = new ArrayList<>(items); // Создаём копию
}
public List<String> getItems() {
return Collections.unmodifiableList(items); // Возвращаем неизменяемую копию
}
}
💡В Java есть встроенные immutable классы, такие как
String, Integer, LocalDate и другие. Используйте их, когда это возможно. #Java #Immutable
👍9❤2
В Java объект
String неизменяемый, что означает, что после создания его состояние нельзя изменить. Но зачем это нужно?1️⃣ Безопасность: неизменяемые строки делают код более безопасным, особенно при работе с потоками или использованием строк в ключах коллекций (например, HashMap).
2️⃣ Производительность: строковые объекты кэшируются в пуле строк (String Pool), что позволяет Java эффективно управлять памятью.
3️⃣ Совместимость: неизменяемость строк облегчает работу с множеством библиотек, так как они не могут непреднамеренно изменить строку.
Пример:
String str = "Hello";
str.concat(" World");
System.out.println(str); // Hello
Хотя метод
concat добавляет строку, оригинальный объект остается неизменным, создавая новый объект в памяти.StringBuilder или StringBuffer.#java #string #immutable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Есть несколько преимуществ в неизменности строк:
✔️ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в Heap, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку.
✔️ Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения.
✔️ Неизменяемость позволяет избежать синхронизации: строки безопасны для многопоточности и один экземпляр строки может быть совместно использован различными потоками.
✔️ Строки используются classloader и неизменность обеспечивает правильность загрузки класса.
✔️ Поскольку строка неизменяемая, её hashCode() кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap т.к. его обработка происходит быстрее.
#java #string #immutable
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6