String的不可变性
它是怎么实现不可变性的?
首先String类被final修饰,那就意味着它不能被继承。那么他里面的方法就不能被覆盖的
无对外暴露字符串的setter方法,可以在一定程度上保证内容不可变,像substring,concat这种API,其
实是new 了一个String然后返回的。
ps:为什么说 一定程度呢,因为如果你通过反射或者unsafe类还是可以修改的
如果我们要实现一个可变的字符串,我们可以使用StringBuffer和StringBuilder
为什么要为不可变
我觉得是出于安全性的考量,String的用途很广泛。因为你不可变,也就意味着可以避免线程安全的问题
而且不可变的话,Hash值就定下来了,而且Hash值是存储在对象头里的,String不断Hash,不可变就可 以复用Hash值,提高效率(因为你Hashcode你根据字符串内容生成的)
Java 9 为何要将 String 的底层实现由 char[] 改成了 byte[] ?
byte数组占用内存空间更小吧。java9之前采用char[],由于java内部使用的编码是UTF16,这就导致即
有些字符可以用1个字节表示,但它还是会占两个字节。
因此java9对他进行了优化
通过byte[](一个byte 8位)和字段coder来控制字符的存储。如果字符串的编码没超过lan-1的范围 (纯英文)就用lan-1,每个字符就占1个字节(8位)而对于超过的话,那就统一采用UTF6,不管中英文来 进行一个存储,每个字符就两个字节(16位)。
String的长度有限制吗
编译期,受限制;运行期,受int最大长度限制