Когда стоит выбрать char[] вместо String?
Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива (как это было сделано раньше в самом
Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк (вроде интернирования), которые могут оказаться эффективнее ваших.
Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.
Существует способ алгоритмической атаки на систему, когда хакер своими действиями вызывает переполнение памяти, и конфиденциальная информация попадает в heap dump.
Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
#Классы
#Безопасность
Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива (как это было сделано раньше в самом
String
).Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк (вроде интернирования), которые могут оказаться эффективнее ваших.
Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.
Существует способ алгоритмической атаки на систему, когда хакер своими действиями вызывает переполнение памяти, и конфиденциальная информация попадает в heap dump.
Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
#Классы
#Безопасность
Под каким типом хранить период времени?
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Оба класса реализуют общий интерфейс
Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration:
До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод
#Классы
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Period
– календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime
.Duration
– длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.Оба класса реализуют общий интерфейс
TemporalAmount
– период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX()
возвращает новый экземпляр с измененным значением.Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration:
"P2DT3H4M"
, Period: "P1Y2M3D"
.До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод
between()
нужного элемента енама ChronoUnit
.#Классы
Какие бывают модификаторы?
🔘 Модификаторы доступа
🔘 Модификаторы для многопоточности
🔘
🔘 final
🔘
🔘
🔘
🔘
#Язык
🔘 Модификаторы доступа
private
, protected
, public
(рассмотрим подробнее в разделе #Классы)🔘 Модификаторы для многопоточности
synchronized
и volatile
(подробнее чуть позже)🔘
static
(рассмотрим подробнее в разделе #Классы)🔘 final
🔘
abstract
(рассмотрим подробнее в разделе #Классы)🔘
native
– реализация метода скрыта внутри JVM, нельзя указывать в пользовательском коде🔘
transient
– поле будет пропущено при сериализации🔘
strictfp
– самый экзотический, ограничивает точность вычисления для переменной с плавающей точкой до стандарта IEEE. Нужно для переносимости между платформами.#Язык