String类
特点
1.所有字符串的字面值常量("abc","123",..)都是一个String类的对象
2.字符串一经初始化不可改变
因为底层使用的是一个 final char[] value,该数组一经初始化,不可改变
3.String str="abc";
底层:"abc"装到底层的字符数组中value={'a','b','c'}
StringBuffer/StringBuilder
特点
StringBuffer/StringBuilder 底层使用的是一个字符数组char[] value,往StringBuffer中添加的内容都会转换为字符添加到底层的字符数组中
当new StringBuffer(),底层开辟的字符数组长度为16,
如果添加的元素超过16个,就会新开辟一个长度为 原有长度*2+2 的一个新的字符数组,把原有内容拷贝新数组中,把新添加的元素追加到新数组的元素的末尾
StringBuffer/StringBuidler的方法
append():
a.不断的往缓冲区(字符数组)末尾追加字符
b.apend()方法的返回的是追加了内容的缓冲区(原有字符数组)
StringBuffer sb=new StringBuffer();
sb.append("ab");//添加到底层的字符数组中char[] value={'a','b'}
sb.append(1)//在添加到原有的字符数组中char[] value={'a','b'.'1'}
//sb.append("ab").append(1);//因为返回的原有的StringBuffer对象,所以可以不断的调用下去
reverse():将缓冲区中所有的字符反转
toString():将缓冲区中所有的内容变成一整个字符串返回
value:想缓冲区中添加的数据,最终都添加到value字符数组中
char[] value
count:缓冲区中字符的个数
底层:new String(value, 0, count);//将value数组,从0索引开始,count个字符转换成字符串
例如:new String({'a','b'},0,2);//相当于转换成"ab"
StringBuffer与StringBuilder区别
1.相同点:方法基本一致
2.不同点:StringBuffer是线程安全的,但是效率低
StringBuilder是线程不安全,效率高
优先考虑StringBuilder
d.字符串拼接
String str="abc";
str=str+"d";//str+"d"
//以上代码相当于:new StringBuilder("abc").append("d").toString();
//StringBuilder sb=new StringBuilder("abc");
//sb.append("d");//追加一个d
//sb.toString();//返回整个字符串new String({'a','b','c','d'},0,4);
//所有的+号拼接底层都是用StringBuilder完成
//str=str+"d";相当于:str=new String({'a','b','c','d'},0,4);
String str2="abcd"//str2指向内存中的一个字符数组对象
//str=new String({'a','b','c','d'},0,4);
System.out.println(str2==str);//内存地址不同返回false