String,StringBuffer,StringBuilder三者的对比
- String:不可变的字符序列;底层使用char[]存储
- StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
- 三者的执行效率
从高到低排列:StringBuilder > StringBuffer > String
-
字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true的字符串的)
public class StringBufferBuilder {
/*StringBuffer的常用方法
增:append(xxx)
删:delete(int start,int end)
改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
查:charAt(int n )
插:insert(int offset, xxx)
长度:length();
遍历:for() + charAt() / toString()*/
@Test
public void test2(){
StringBuffer s1 = new StringBuffer("abc");
s1.append(1);
s1.append("1");
System.out.println(s1);
s1.delete(2,4);//左闭右开
System.out.println(s1);
s1.replace(1,2,"hello");
System.out.println(s1);
s1.insert(2,"kkk");
System.out.println(s1);
s1.reverse();//反转
System.out.println(s1);
String s2 = s1.substring(1, 3);//切割重新建立了,需要建立s2接收
System.out.println(s2);
}
/*
String、StringBuffer、StringBuilder三者的异同?
String:不可变的字符序列。底层使用char[]进行存储
StringBuffer:可变的字符序列 线程安全的,效率偏低。底层使用char[]进行存储
StringBuilder:可变的字符序列 线程不安全的,效率高 底层使用char[]进行存储
源码分析:
String str = new String();//new char[0]
String str1 = new String("abc");//new char[]{'a','b','c'}
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16]
//底层创建了一个长度是16的char类型数组
sb1.append('a');//value[0]='a';
sb1.append('b');//value[1]='b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length+10];
//问题1:System.out.println(sb2.length());
问题2:扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组
默认情况下,扩容为原来容量的2倍+2 ,同时将原有数组中的元素复制到新的数组中
开发中,建议使用StringBuffer或者StringBuilder
*/
@Test
public void test1(){
StringBuffer sb1 = new StringBuffer("abc");
sb1.setCharAt(0,'m');//替换,把0位置上换成m
//没有新建常量,而是直接修改,可变性
System.out.println(sb1);
StringBuffer sb2 = new StringBuffer();
System.out.println(sb2.length());//0
}
}
网友评论