String、StringBuffer、StringBuilder三者的异同?
String: 不可变的字符序列;底层使用char[]存储(jdk1.8及1.8之前的版本,jdk1.8之后的版本用的是byte[])
StringBuffer: 可变的字符序列;线程安全的,效率低;底层使用char[]存储
StringBuilder: 可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储.
- StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,
- 只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的, 而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
- 在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全
StringBuffer的常用方法:
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换 为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转 *
public int indexOf(String str)
public String substring(int start,int end):返回一个从start开始到end索引结束的 左闭右开区间的子字符串
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)
总结:
增: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()
例
public static void main(String[] args) {
String str="qwer";
str=str+"123";//新创建"qwer123“对象
StringBuffer sb1=new StringBuffer("abc");
sb1.append("123");
System.out.println(sb1);
//sb1.delete(1,3);//含头不含位
System.out.println(sb1);
//sb1.replace(1,3,"字母");
sb1.setCharAt(4,'Y');
System.out.println(sb1);
sb1.insert(3,"FF"); System.out.println(sb1);
}
String、StringBuffer、StringBuilder效率对比
public static void main(String[] args) {
long startTime=0;
long endTime=0;
String str="";
StringBuffer sb1=new StringBuffer("");
StringBuilder sb2=new StringBuilder("");
startTime=System.currentTimeMillis();
for ( int i=0;i<40000;i++){
str=str+i;
}
endTime=System.currentTimeMillis();
System.out.println("String拼接执行的时间"+(endTime-startTime));
startTime=System.currentTimeMillis();
for ( int i=0;i<40000;i++){
sb1.append(i);
}
endTime=System.currentTimeMillis();
System.out.println("StringBuffer拼接执行的时间"+(endTime-startTime));
startTime=System.currentTimeMillis();
for ( int i=0;i<40000;i++){
sb2.append(i);
}
endTime=System.currentTimeMillis();
System.out.println("StringBuilder拼接执行的时间"+(endTime-startTime));
}
StringBuffer、StringBuilder和String的使用场合
综上所述:
操作少,数据少,用String
单线程,操作多,数据多,用StringBuilder
多线程,操作多,数据多,用StringBuffer