String
String与StringBuffer与StringBuilder
String类
- String是一个final类,代表不可变的字符序列
- String对象的字符内容是存储在一个字符数组value[]中的(JDK9改为byte[])
- String实现Serializable/Comparable接口,分别代表其是可序列化的和可以比较大小
JDK1.8里,字符串常量池在堆里
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
只要其中有一个是变量,结果就在堆中
若拼接的结果调用intern()方法,返回值就在常量池中
String类型的常量池比较特殊。它的主要使用方法有两种:
- 使用双引号
- intern()方法
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
StringBuffer类
java.lang.StringBuffer代表可变的字符序列
- 作为参数传递时,方法内部可以改变值!
StringBuffer类对象必须使用构造器生成!!!
- StringBuffer():初始容量为16的字符串缓冲区
- StringBuffer(int size):构造指定容量的字符串缓冲区
- StringBuffer(String str):将内容初始化为指定字符串内容
StringBuilder类
其和StringBuffer基本一致,但是由于StringBuffer效率低所有引入StringBuilder
但是它是线程不安全的!而StringBuffer是线程安全的!!
作为参数传递的话,String不会改变值,但是StringBuffer与StringBuilder会改变值
总结:
String、StringBuffer、StringBuilder都是final类,即都不可以被继承
String类长度不可变,StringBuffer与StringBuilder类长度是可以改变的
StringBuffer线程安全、StringBuilder线程不安全!