JDK1.8里,字符串常量池在堆里
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
只要其中有一个是变量,结果就在堆中
若拼接的结果调用intern()方法,返回值就在常量池中
String类型的常量池比较特殊。它的主要使用方法有两种:
JDK1.6中,常量池位置在永久代中,存储的是对象!jdk1.7 常量池位置在堆中!
存储的是引用!JDK8中,永久代被元空间取代,转移到堆内
String s1 = "a"; //在字符串常量池中创建了一个字面量为"a"的常量!!!
s1 = s1 + "b"; //原来的“a”字符串对象已经丢弃了,堆空间出现“ab”
String s2 = "ab"; //直接在字符串常量池中创建一个字面量为“ab”的字符串
String s3 = "a" + "b"; //s3指向字符串常量池中已经创建的“ab”字符串
String s4 = s1.intern(); //堆空间s1对象调用intern,将常量池中已经存在的“ab”赋值给s4
java.lang.StringBuffer代表可变的字符序列
StringBuffer类对象必须使用构造器生成!!!
其和StringBuffer基本一致,但是由于StringBuffer效率低所有引入StringBuilder
但是它是线程不安全的!而StringBuffer是线程安全的!!
作为参数传递的话,String不会改变值,但是StringBuffer与StringBuilder会改变值
总结:
String、StringBuffer、StringBuilder都是final类,即都不可以被继承
String类长度不可变,StringBuffer与StringBuilder类长度是可以改变的
StringBuffer线程安全、StringBuilder线程不安全!
原文:https://www.cnblogs.com/yfyyy/p/13712648.html