String的底层结构
底层是个数组
jdk9之前是char数组,jdk9之后是byte数组;这个数组是final的
为什么要将char数组改为byte数组,是因为经过调研之后发现,大多数的字符串都适用Latin-1字符编码(iso-8859-1)表示的;一个char占用两个字节,Latin-1字符编码占用一个字节
char占用两个字节,所以无法存储一个表情符号,如😊
所以在处理的时候很安全和可靠,是线程安全的
一旦重建就不能修改了;修改的话就会返回一个新的字符串;
因为是数组,查找的时候就很快;
在jvm中有个常量字符串池,节约内存,提高性能
可变字符串:
StringBuffer 线程安全的,方法是同步
StringBuilder 线程不安全的,没有同步的性能开销
废话短说