String,StringBuffer,StringBuilder性能比较,线程安全测试,源码解析。

  1. 第一个区别

public class example1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string="aaa";
        String string1="aaa";
        String str=new String("abc");
        String str1=new String("abc");
        StringBuffer strbuf=new StringBuffer("bcd");
        StringBuffer strbuf1=new StringBuffer("bcd");
        StringBuilder strbui=new StringBuilder("cde");
        StringBuilder strbui1=new StringBuilder("cde");

        if (string==string1) {
            System.out.println("string==string1");
        }
        if (str==str1) {
            System.out.println("str和str1 ==相同");
        }
        if (strbuf==strbuf1) {
            System.out.println("strbuf和strbuf1 ==相同");
        }
        if (strbui==strbui1) {
            System.out.println("strbui和strbui1 ==相同");
        }


    }

}

结果string==string1

  1. 解析:==比较的是地址,结果表明String是个常量,“abc”在内存中创建,这里的string,string1都是指向的”abc”,所以相等,而其它都是创建新的对象,所以地址不同,不相等。StringBuffer,StringBuilder都没有重写equals方法,所以是继承的object方法,比较的是地址。
  2. 性能比较
package test;

public class example {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       String str="abc";      
       long starttime=System.currentTimeMillis();    
       for (int i = 0; i < 100000; i++) {
        str=str+"abc";
        }
       long endtime=System.currentTimeMillis();
       String strtime=endtime-starttime+"";
       System.out.println("string花费时间"+strtime+"毫秒");

       StringBuffer strBuf=new StringBuffer("abc");
       long starttime1=System.currentTimeMillis();    
       for (int i = 0; i < 100000; i++) {
        strBuf=strBuf.append("abc");
       }
       long endtime1=System.currentTimeMillis();
       String strtime1=endtime1-starttime1+"";
       System.out.println("stringBuffer花费时间"+strtime1+"毫秒");
       StringBuilder strbui=new StringBuilder("abc");
       long starttime2=System.currentTimeMillis();  
       for (int i = 0; i < 100000; i++) {
        strbui=strbui.append("abc");
       }
       long endtime2=System.currentTimeMillis();
       String strtime2=endtime2-starttime2+"";
       System.out.println("stringBuilder花费时间"+strtime2+"毫秒");
    }
    }

结果:string花费时间18141毫秒
stringBuffer花费时间5毫秒
stringBuilder花费时间4毫秒

多次试验得到速度StringBuilder>stringBuffer>string

  1. 解释主要是由于string是个常量,每次拼接实际上是生成一个新的string对象,而stringBuilder和stringBuffer是分配一片内存,不够再加,操作是的同一个对象,由于这个是单线程,所以stringBuilder比stringBuffer稍微快一点。

StringBuffer,StringBuilder默认是16个字节

 public StringBuffer() {
        super(16);
    }
     public StringBuilder() {
        super(16);
    }

3.线程安全


class Ticket implements  Runnable {
    private static int t=0;

     StringBuffer sb = new StringBuffer();  
     StringBuilder sc=new StringBuilder();
    boolean flag=true;  
     public void run() {    
        while (flag) {
            if (t<100) {
                  sb.append(t+"a ");
                  sc.append(t+"a ");
                  t++;            
                    }else {                                             
                        flag=false;                                                         
                        System.out.println("stringbuffer"+sb);
                        System.out.println("stringbuilder"+sc);
                    }           
        }

    }   
}
public class Thread7 {
     public static  void main(String[] args)
     {
        Ticket t=new Ticket();
        Thread t1=new Thread(t);   
        Thread t2=new Thread(t);
        Thread t3=new Thread(t);
        t1.start();
        t2.start();     
        t3.start();

     }
}

结果stringBuilder线程是不安全的

这里写图片描述
源代码

synchronized关键字
 @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
  没有关键字
 @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
StringStringBuilderStringBuffer 都是 Java 中的字符串类,它们的主要区别在于线程安全性和性能。其中,String 是不可变类,每次修改都会生成新的对象,因此在频繁修改字符串时会产生大量内存垃圾,影响性能;而 StringBuilderStringBuffer 都是可变类,它们的实现方式类似,但 StringBuffer线程安全的,因此在多线程环境中使用 StringBuffer 能够保证数据的一致性,但是在单线程环境中,StringBuilder性能更优。 为了测试它们的性能,我们可以编写以下代码: ``` public static void main(String[] args) { long startTime; long endTime; // 测试 String String str = ""; startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { str += "a"; } endTime = System.currentTimeMillis(); System.out.println("String: " + (endTime - startTime) + "ms"); // 测试 StringBuilder StringBuilder stringBuilder = new StringBuilder(); startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { stringBuilder.append("a"); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder: " + (endTime - startTime) + "ms"); // 测试 StringBuffer StringBuffer stringBuffer = new StringBuffer(); startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { stringBuffer.append("a"); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer: " + (endTime - startTime) + "ms"); } ``` 以上代码会生成长度为 100000 的字符串,分别使用 StringStringBuilderStringBuffer 进行拼接,最后输出每个类的执行时间。根据测试结果,StringBuilder 的执行时间最短,其次是 StringBufferString 的执行时间最长。因此在单线程环境中,我们应该优先选择使用 StringBuilder 来拼接字符串。在多线程环境中,应该考虑使用 StringBuffer 来保证数据的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值