String声明为final的,不可继承的实现了Serializable接口:
表示字符串是支持序列化实现了COmparable接口,是可以比较大小的 在JKD8以前内部定义了final char[] value 用于存储字符串数据jdk9时改成了byte[]+标识,如果是字符串,则仍然使用char作为底层,如果是字母类型,则用byte类型,字母类型使用byte能够比原来节省1半的空间 1. String具有不可变性
当字符串重新赋值时,就需要重写指定内存区域的赋值,不能使用原有的value进行赋值
当对现在字符串进行操作做时,也需要重新制定内存空间进行复制,不能再原来的value上进行赋值
当调用replace()方修改指定的字符串时,也需要重新指定内存区域进行赋值,不能使用原有的value进行赋值
通过字面量的方式(区别于new) 给一个字符串进行字符串赋值,此时的字符串声明是在字符串常量池中。 字符串常量池中不会存储存储相同内容的字符串String 的String pool 是一个固定大小的的hashtable,默认值大小长度为1009,如果放进String pool 的String非常多,就会造成hash冲突,从而导致链表会非常长,而链表长了之后直接影响了调用String.intern时的性能使用-XX:StringTableSize来设置StringTable的长度在JDK6中,StringTable是固定的,固定为1009,如果常量池中的字符很多就会导致效率下降很快,StringTableSize设置没有要求在JDK7中,StringTable的默认长度为60013,设置长度没有要求JDK8中,1009是可设置的最小值 字符串的拼接
- 常量与常量的拼接结果是放在常量池中的,原理是编译期的优化常量池中不会存在内容相同的常量只要其中有一个是变量,结果就是在堆中,变量拼接的原理是StringBuilder如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入到常量池中,并返回此对象地址



