文档章节

Java基础1(String StringBuilder StringBuffer 三者区别)

木九天
 木九天
发布于 2018/01/25 13:53
字数 902
阅读 27
收藏 0

问题:String str =“niu”;  创建了一个对象  常量池

        String str ="hah" +"oo"; 创建了三个对象 都在常量池

    String str =new String("oo"); 创建了2个对象 一个在常量池,另外一个被复制到堆中

 

JVM包含5个,寄存器,方法区。栈,堆,本地方法区  而String 是final 类型,创建的对象要放到常量池中,

http://blog.csdn.net/Meiyang1990/article/details/50857842

进入正文:

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 

 2.String <(StringBuffer,StringBuilder)的原因

    String:字符串常量

    StringBuffer:字符创变量

    StringBuilder:字符创变量

从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码:

1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1

  我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。

  而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

3.

 

String str = “This is only a” + “ simple” + “ test”;
StringBuffer builder = new StringBuilder(“This is only a”).append(“simple”).append(“ test”);

  

  你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:

    String str = “This is only a” + “ simple” + “test”;

    其实就是:

    String str = “This is only a simple test”;

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

    String str2 = “This is only a”;

    String str3 = “ simple”;

    String str4 = “ test”;

    String str1 = str2 +str3 + str4;

    这时候JVM会规规矩矩的按照原来的方式去做。

4.

 StringBuilder:线程非安全的

    StringBuffer:线程安全的

    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

 

 对于三者使用的总结

      1.如果要操作少量的数据用 = String  

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

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

© 著作权归作者所有

木九天

木九天

粉丝 256
博文 287
码字总数 213425
作品 0
海淀
程序员
私信 提问
[Java学习]Striing StringBuffer StringBuilder 的比

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/52159425 最近发现对java中一些比较基础的东西掌握还是...

紫雾凌寒
2016/08/09
0
0
【翻译】Java中String, StringBuffer, StringBuilder的区别

String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会用String定义一些内容,然后通过著名的System.out.println()语句来打印出来。 然而,很多Java新手都不会意识到 String...

YuanyuanL
2014/09/03
474
4
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: 用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。 ...

watermelon11
2019/02/23
32
1
面试系列-String,StringBuffer,StringBuilder三者区别

String,StringBuffer以及StringBuilder三者的区别主要是在两个方面,即运行速度和线程安全这两方面。 运行速度 从快到慢顺序: StringBuilder > StringBuffer > String String最慢的原因; ...

技术小能手
2018/07/12
0
0
String、StringBuilder、StringBuffer 用法比较

String、StringBuilder、StringBuffer 三个类源自JDK的 java/lang/ 目录下: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全,JDK 5.0(1.5.0...

长平狐
2013/01/06
155
0

没有更多内容

加载失败,请刷新页面

加载更多

如何制作省市级别上钻下取的在线疫情地图

目前大多数省级尺度的疫情地图,不能精细的表达各个城市的疫情差异和发展事态。纯粹市级维度的地图由于全国市比较多,很难快速查看自己所在省市的疫情分布情况。我们制作一个省市下钻上取的疫...

空间数据可视化
今天
113
0
用Markdown编程之虚转实

没变成机器码之前,撒都是虚的。而要变成机器码必须有长度。有长度后必然是结构划分。之后就是逻辑正确。而逻辑正确可以看成正确的值。 由此,基础行为有:长度的比对转换、结构的解析、值的...

dwcz
今天
80
0
ASP之ADODB.Stream

ASP 其实很强,真的,很强... 但是,也很难,难就难在没有文档啊~~~ 因为 ASP 经常会用到很多服务器对象,本文记录下在 ASP 中的 Stream(流)操作。 ADODB.Stream 未完待续,敬请期待......

AioDiage
今天
71
0
从源码看世界:Springboot整合Mybatis后到底做了什么

在Mybatis一次数据库操作过程的文章中,我展示了使用Mybatis操作数据库的demo,但实际使用时并不会这里写代码,因为一般都会使用springboot了,那现在我们一起来看看Springboot整合Mybatis之...

壞天空_囝仔
今天
46
0
【自用】 Flutter GestureDetector 给控件添加监听事件

Dart GestureDetector( child: Text("xxxx"), onTap: () => _onXxxxCall(index), ) PS:自用的 不做解释 作者:一个吃货帅锅...

Tensor丨思悟
今天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部