【基本特性】final修饰、实现Serialize跨进程、Comparable可比较用作排序;
【解释】不可变的字符序列,它是存储在堆区的常量池中的(两种办法:""、intern()都可以。)
【变化】JDK1.8char型数组存储,1.9之后使用的是byte型数组存储。
【解释】字符串常量池中是不会存储相同内容的字符串的,字符串数组和链表的博弈,StringTablSize 。
jps查看Java Virtual Machine Process Status Tool,查看虚拟机进程
option:
jinfo -flag StringTableSize 进程id
放在堆中,
【变化】1.6字符串常量在永久代:极少GC导致OOM更易出现;1.7字符串常量池放在堆中,调优的时候只需要改变堆的大小。
码点序列一致就不需要重新加载String实例。
拼接操作的效率更低,因为涉及到两个操作:new StringBuilder和底层的toString下的new String对象。占用的内存也更多,GC更加频繁。
append只有本身的一个对象。
把对象放入字符串常量池的方法:有的直接拿,没有直接加载新的
本不存在就给引用或者""对象。
大的网站平台,需要内存中存储大量的字符串。字符串都调用 intern() 方法,就会明显降低内存的大小。
public static void main(String[] args) throws InterruptedException { String s1 = new String("a") + new String("b"); String s2 = "ab"; String s3 = new String("ab"); // s3 =等价于= s1+s2 }
干掉new 出来的重复String对象!
使用一个hashtable来记录所有的被string对象使用的不重复的char数组。当去重的时候,会查这个hashtable,来看堆上是否已经存在一个一模一样的char数组。
如果存在,string对象会被调整引用那个数组,释放对原来的数组的引用,最终会被垃圾收集器回收掉。