Java String、StringBuffer和StringBuilder 三剑客

先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。

 

你们业余时间做的最多的事情是什么?哪一个消耗的时间长,我每天除了上班,下班回去就是写文章,看文章,然后学习。

虽然很充实,但是很单调啊,是不是自己该找一个兴趣爱好来搭配一下。

废话不多说了,开始今天的内容。

今天主要说说 Java中的 String、StringBuffer和StringBuilder ,都是我们经常使用的,可能有些你只是使用,并不知道他好在哪里,或者有些你现在的使用是错误的。
 

01

概念

至于概念基本都了解,他们都是处理字符串的,比如字符串定义,拼接,截取等等。

那么他们都是来自什么类呢?

1、java.lang.String

2、java.lang.StringBuffer

3、java.lang.StrungBuilder


我们来说一下他们都有那些特点呢?
 

1,三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
 

2,StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
 

3,StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
 

4,StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
 

5,String实现了三个接口: Serializable、Comparable<String>、CarSequence

StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
 

02

运行速度


对比的时候我首先考虑的就是速度,毕竟效率是最主要的,我们通过时间的长短来判定,那个效率高。
 

public static void main(String[] args) {
long a=new Date().getTime();
        String cc="";
int n=10000;
for (int i = 0; i < n; i++) {
            cc+="."+i;
        }
   System.out.println("String的时间"+(System.currentTimeMillis()-a)/1000.0+"s");
long s1=System.currentTimeMillis();
        StringBuilder sb=new StringBuilder();
for (int i = 0; i < n; i++) {
            sb.append("."+i);
        }
   System.out.println("StringBuilder的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");
long s2=System.currentTimeMillis();
        StringBuffer sbf=new StringBuffer();
for (int i = 0; i < n; i++) {
            sbf.append("."+i);
        }
        System.out.println("StringBuffer的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");

    }

打印结果:
String的时间1.558s
StringBuilder的时间0.004s
StringBuffer的时间0.012s

通过对比发现,StringBuilder效率是最高的,StringBuffer次之,String是最低的。所以建议大家以后考虑最好的使用。

03

安全考虑

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

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。

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


建议使用的场景:

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

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

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

04

应用
 

在使用方面,这里说几个技术点,这样更能直观的了解。

1,String与StringBuffer相互转换


由于String一旦赋值就不能改变为了,所以需要转换,使用StringBuffer的功能,而StringBuffer还有多种操作。
转换方式:
(StringBuffer sb = new StringBuffer(str);)

2,StringBuffer向String转。

因为需要的结果是String类型,所以直接通过 toString的方式
(String str = sb.toString();)

3.字符串拼接实例
 

public class StringBufferDemo {
public static void main(String[] args) {
  //创建StringBuffer对象
  StringBuffer sb2 = new StringBuffer();
  //因为append()返回缓冲区本身
  sb2.append("程序职场").append(false); //链式编程
  //sb.reverse();
  //String s = new String(sb);//反转并转成String类型,不简洁
  //反转并转成String类型
  System.out.println(sb2.reverse().toString());

  StringBuilder sb3 = new StringBuilder();
  sb3.append("公众号:程序职场");
// sb3.setLength(1);//缓冲区设置为1
  System.out.println(sb2.reverse().toString());
  }
}


1,StringBuffer可以通过append的方式拼接字符串
2,String是直接new一个对象赋值
3,   StringBuilder和StringBuffer 的用法都差不多
 

本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaBasic/JavaString  已收录,欢迎 star。

 

我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
CSDN:程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉默的闪客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值