Java基础之String:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解

Java基础之String:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解


前言

今天博主将为大家分享:Java基础之String:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解!不喜勿喷,如有异议欢迎讨论!


简述

首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

  1. String最慢的原因:

    String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
  1. 而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多
  1. 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

直接上代码
package com.test;

/**
*

  • @Description: 为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解

  • 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

  • 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,

  • 所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。

  • 所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

  • stringbuilder类的append方法是return this,而string类的方法都是return new String

  • 因为string使用final char[] value数组存储字符串内容,每次修改是return new String返回一个新的字符串,需要重新生成一个字符串对象,

  • 申请内存空间,这花了时间,而stringbuilder类的value数组不是final的,是可变的,不需要重新生成新的对象,但是数组扩容其实也是换一个更大的数组罢了

  • @ClassName: Test.java

  • @author ChenYongJia

  • @Date 2019年6月26日 晚上20:23

  • @Email chen87647213@163.com
    */
    public class Test {

    public static void main(String[] args) {
    String str = “”;
    StringBuffer sb = new StringBuffer();// 线程安全
    StringBuilder sbBuilder = new StringBuilder();// 线程不安全
    long start = 0L;
    long end = 0L;
    start = System.currentTimeMillis();
    for (int i = 0; i < 99999; i++) {// 进行十万次循环
    str = str + “我们来测试一下试试看看差异有多大!”;
    }
    end = System.currentTimeMillis();
    System.out.println(“使用string的时间是:” + (end - start) + “毫秒!”);

     start = System.currentTimeMillis();
     for (int i = 0; i&lt; 99999; i++) {// 进行十万次循环
     	sb.append("我们来测试一下试试看看差异有多大!");
     }
     end = System.currentTimeMillis();
     System.out.println("使用StringBuffer的时间是:" + (end - start) + "毫秒!");
    
     start = System.currentTimeMillis();
     for (int i = 0; i &lt; 99999; i++) {// 进行十万次循环
     	sbBuilder.append("我们来测试一下试试看看差异有多大!");
     }
     end = System.currentTimeMillis();
     System.out.println("使用StringBuilder的时间是:" + (end - start) + "毫秒!");
    

    }

}

我们看执行结果最直观

在这里插入图片描述
String拼接了223秒,另外两个是毫秒级别,不用我多说了吧各位


总结
  • String:适用于少量的字符串操作的情况

  • StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  • StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

  • stringbuilder类的append方法是return this,而string类的方法都是return new String

  • 因为string使用final char[] value数组存储字符串内容,每次修改是return new String返回一个新的字符串,需要重新生成一个字符串对象,申请内存空间,这花了时间,而stringbuilder类的value数组不是final的,是可变的,不需要重新生成新的对象,但是数组扩容其实也是换一个更大的数组罢了


到这里:Java基础之String:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解!,分享完毕了,快去试试吧!


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值