String、StringBuffer、StringBuilder

  最近上课讲到String类,课下补充StringBuffer和StringBuilder的东西。java

  一、首先这三个都是java中处理字符串的经常使用类。安全

  二、三者在执行速度方面是 StringBuilder>StringBuffer>String的。app

    至于为何String执行速度慢,是由于String是字符串常量,也就是不可改变的对象。而StringBuilder、StringBuffer是字符串变量。ui

    具体请看如下代码:spa

String str="Hello";
str=str+" "+" World!"
System.out.println(str);//结果是Hello World!

    从代码中咱们能够得出,咱们确实改变了String型的str,但事实上JVM是这么解析的:首先在栈内存申请str的空间并指向堆内存中申请出的“Hello”空间。  当咱们第二行改变str的时候,并非在“Hello”的空间上直接改变,而是另外新申请了另两段空间,建立了“ ”和“World!”,以后再申请空间合并成了“Hello World!”,此前的三个“Hello”、“ ”、“World!”空间被java的垃圾回收机制回收。可想而知,这样的执行效率是很低的。线程

  而StringBuilder、StringBuffer是字符串变量,变量就与常量不一样了,能够随意改变内容而不用从新new一个对象。因此在改变字符串的内容时,速度会快不少。code

  3.一个String速度不输StringBuffer的特殊状况对象

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

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

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

    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

    StringBuilder:线程非安全的

    StringBuffer:线程安全的

    当咱们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操做是安全的,虽然他的速度最快,可是能够保证StringBuffer是能够正确操做的。固然大多数状况下就是咱们是在单线程下进行的操做,因此大多数状况下是建议用StringBuilder而不用StringBuffer的,就是速度的缘由。

相关文章
相关标签/搜索