• String、StringBuffer、StringBuilder


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

      1、首先这三个都是java中处理字符串的常用类。

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

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

        具体请看以下代码:

    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一个对象。所以在改变字符串的内容时,速度会快很多。

      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的一个把戏,实际上:

        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的,就是速度的原因。

  • 相关阅读:
    vagrant创建centos7后虚拟机磁盘爆满
    Linuxpython删除某个目录文件夹及文件的方法
    Oracle 中常用查询用户、角色、权限等SQL
    log4j2 rce几个疑惑点解惑
    2021年总结和反思
    使用grep命令,玩转代码审计寻找Sink
    VSCode使用技巧
    [转载]什么是电源的纹波,如何测量它的值,又如何抑制呢?
    【Bug system】GCC Bugzilla
    .net core3.1开始页面实时编译
  • 原文地址:https://www.cnblogs.com/hxtblogs/p/7654482.html
Copyright © 2020-2023  润新知