Java String 对象,你真的了解了吗

String 对象的实现

String对象是java中使用最频繁的对象之一,所以Java公司也在不断的对String对象进程优化,以便提升String对象的性能。看下面这张图,一起了解下String对象的优化过程
Java String 对象,你真的了解了吗

在java6以及之前的版本中

String对象是对char数组进行了封装实现的对象,主要有四个成员变量: char 数组、偏移量 offset、字符数量 count、哈希值 hash。

String对象是通过offset和count两个属性来定位char数组,这样做可以高效、快速的共享数组对象,同时节省内存空间,但是这样很有可能导致内存泄漏

从java7版本开始到java8版本

从Java7版本开始,java对String类做了一些改变。String类中不再有offset和count两个变量了。这样的好处是String对象占用的内存稍微少了点,同时String.substring方法也不再共享char[],从而解决了使用该方法可能导致的内存泄漏问题。

从java9版本开始

将char[]数组改成byte[]数组,为什么需要这样做呢?我们知道char是两个字节,如果用来存一个字节的字符有些浪费,为了节约空间,java公司,java公司就改成了一个字节的byte来存储字符串。这样再存储一个字节的字符就避免了浪费

在 Java9 维护了一个新的属性coder,它是编码格式的标识,在计算字符串长度或者调用 indexOf() 函数时,需要根据这个字段,判断如何计算字符串长度。coder 属性默认有 0 和 1 两个值, 0 代表Latin-1(单字节编码),1 代表 UTF-16 编码。如果 String判断字符串只包含了 Latin-1,则 coder 属性值为 0 ,反之则为 1。