首先,我们先来简单了解一下这两个类:
- 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
- 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
再来看String类:
- String类表示字符串,所有的字符串文字都是此类的实例,因此任何一个字符串都是String类的对象也就是实例
- 但是,字符串是不可变的,它们的值在创建后无法更改,这就导致每次对String类的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。
也许有人会有疑问,为什么不能改,字符串经常拼接呀,为什么不能改?
在字符串的内部,是用一串字符来描述字符串的,在内部有一个char数组,用来存储数据。比如我们写一个字符串 “你今天学习了吗”,这时候就是一个char数组,第一个字符存的是 ‘你’,第二个字符存的是 ‘今’,依次类推,因为数组已经确定长度无法改变,所以,字符串确定以后也是不可改的
拼接字符串的含义
比如我们有两个字符串a和b,它是拿a和b拼接,拼接完了以后a还是a,b还是b,但是产生了一个新的结果c,这个c就是拼接后的结果
例子:
String s1 = "12345";
String s2 = "上山打老虎";
String s3 = "老虎不在家";
s1= s1 + s2 + s3;
System.out.peintln(s1);//输出结果为:12345上山打老虎老虎不在家
1、从运行速度上来看这三者的关系为:
StringBuilder > StringBuffer > String
因为StringBuffer 和 StringBuilder都是字符串变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多的。而String是字符串常量,所以String对象一旦创建之后就不可更改了,因此Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
测试代码:
public class StringTest {
public static void getStringTime(){
//获取当前系统时间
long a=System.currentTimeMillis();
//创建一个空字符串
String cc="";
//执行拼接字符串的操作
for (int i = 0; i < 10000; i++) {
cc += i;
}
System.out.println("String使用的时间:"+(System.currentTimeMillis()-a)/1000.0+"s");
}
public static void getStirngBuilderTime(){
long s1=System.currentTimeMillis();
StringBuilder sb=new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
System.out.println("StringBuilder使用的时间:"+(System.currentTimeMillis()-s1)/1000.0+"s");
}
public static void getStringBufferTime(){
long s2=System.currentTimeMillis();
StringBuffer sbf=new StringBuffer();
for (int i = 0; i < 10000; i++) {
sbf.append(i);
}
System.out.println("StringBuffer使用的时间:"+(System.currentTimeMillis()-s2)/1000.0+"s");
}
}
测试结果:
2、再来说线程安全:
- 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
- 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么最好使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
3、最后,简单说一下 StringBuffer 和 StringBuilder 的使用方法
★再次强调一遍,这两者的用法基本相同,主要区别在于线程安全与运行速度这两个方面
public class Test{
public static void main(String args[]){
StringBuffer sbr = new StringBuffer("百度官网:");
sbr.append("www");
sbr.append(".baidu");
sbr.append(".com");
System.out.println(sbr);
}
}
//输出结果:百度官网:www.baidu.com