Внутреннее представление строк в Java 9

Как мы помним, в Java с незапамятных времён внутри класса java.lang.String строки хранились в массиве char-ов. Каждый char  занимает два байта, так как в момент создания Java существовал только UTF-16, но не было UTF-32 и прочих. И вообще в Unicode не было символов, которые бы занимали больше двух байт.

Первоначально это, разумеется, сильно облегчало хранение и обработку строк, однако сейчас кроме недостатка в том, что существуют символы, занимающие больше 2 байт, есть ещё один недостаток, заключающийся в том, что в случае хранения в строке только символов, которым достаточно восьми бит, первоначальный байт всегда будет равен нулю.

В Java 9 было изменено внутреннее представление строк. Теперь строки хранятся в виде массива байт и плюс флаг кодировки. Если строка содержит только символы, которым нужно 8 бит, то используется LATIN-1, что позволяет избавить нас от избыточного хранения огромного количества байт с нулями. Если хотя бы один символ не попадает в диапазон символов, которым нужно больше восьми бит для представления, то используется UTF-16.

А представляете, как прекрасны были строки в Java в самом начале, когда максимально для хранения одного символа Unicode было достаточно 16 бит, а сами строки в Java тоже состояли из char-ов занимающих 16 бит? Да, Java уже давно далеко не так стройна, строга и прекрасна, как это задумывалось первоначально. Все эти монады, функциональщина, стирание типа, автоупаковка и распаковка, куча разных классов для хранения даты и времени — всё это уродует её и делает использование языка более сложным, особенно для начинающих, но нужно понимать, что Java уже около 30 лет…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *