关于String,StringBuilder,StringBuffer之间的区别的总结

近几天再看面试题,发现之间的基础知识有很多都叫不准,模棱两可,所以想将一些基础知识总结起来,也是再巩固一遍。希望在秋招的时候能够有一个理想的工作。

关于三者的区别,大致分为两个方面

1.执行速度方面

String<StringBuffer<StringBuilder

原因如下:我们都知道String为字符串常量,是不可变的量,但是我们会常常看到如下的情况

String a="abc";
a=a+"def";
System.out.println(a);//结果为abcdef

 

在这里我们看到String类型的a发生了改变,那为什么说字符串常量是不可变的量呢,其实这是一种假象,String类型的a其实并没有发生改变,jvm在执行这段代码的时候,首先创建对象a,赋值为abc,然后再创建一个新的对象a用来执行第二行代码,所以原来的对象a并没有发生改变,因此可以说String类型是不可改变的对象,由于jm的这种机制,String修改字符串时,实际时不断地创建新的对象,原来的对象就会变成垃圾,被垃圾回收机制(GC)回收。所以String的执行速度很慢,效率很低。

 

 

内存分析图

 

而StringBuffer与StringBuilder则不同,他们是字符串变量,可以改变,当我们应他们对字符串进行操作的时候,实际上是对一个对象进行改变,不用像String那样重新创建对象,然后再进行操作,这样就节省了时间,大大提高了效率。

另外,有时会出现这种情况

String str="abc"+"def";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("def");
System.out.println(str);
System.out.println(stringBuilder.toString());

 

这样输出结果也是“abcdef”和“abcdef”,但是String的速度却比StringBuilder(StringBuffer同理)的反应速度要快很多,其实,这是jvm的一个把戏

String str = “abc” + “ def”;

其实就是:

String str = “abcdeft”;

所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:

String str2 = “abc”;

String str3 = “ def”;

 

String str1 = str2 +str3 + str4;

 

这时候JVM会规规矩矩的按照原来的方式去做,不断的创建、回收对象。速度就会很慢

 

2.线程安全方面

StringBuffer和StringBuilder在用法上基本上是相同的,不同的地方在于,StringBuffer是线程安全的,可用在多线程中,而

StringBuilder是非线程安全的,只能用在单线程中,这是因为StringBuilder中的所有方法都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

总结: 1.如果要操作少量的数据用  String

    2.单线程操作字符串缓冲区 下操作大量数据用 StringBuilder

    3.多线程操作字符串缓冲区 下操作大量数据用 StringBuffer

本文总结了网上各位朋友的经验,有很多借鉴的东西,只希望能让自己能够巩固学到的内容,也给需要的人一些帮助吧

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值