JDK9对String底层存储的优化

  1. 在JDK9之前
    String底层使用的是CharArray来存储的,Java中一个char占用2Byte。
    然而对于英文字符、数字等标准字符实际上只用1Byte就足够了,所以旧的String实现在存储包含这些字符的字符串时,在这些字符上浪费了一倍的内存空间。

  2. 从JDK9开始
    String底层改用了ByteArray来做底层存储,每个元素只占一Byte,其粒度更细了,就避免了在以上常规字符存储上的空间浪费。

  3. 问题
    对于拉丁字符串,直接取ArrayLength就是字符串的长度。但非拉丁字符仍要占用2Byte,那字符串长度怎么计算呢?
    在新的String底层,使用了latin和utf16两个编码器来区分拉丁字符与非拉丁字符(比如汉字)。
    在String底层通过编码器的不同,对非拉丁字符串的ArrayLength做了一个除以2的位运算。

原文地址:https://www.cnblogs.com/JaxYoun/p/15586080.html