zoukankan      html  css  js  c++  java
  • 代码优化:尽量重用对象。StringBuilder/StringBuffer/+

    重点注意:对象

    特别是String对象的使用,出现字符串拼接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。

    字符串的拼接在开发过程中使用是非常频繁的,常用的方式有三种:

    (1)、+ 号拼接: str+"456"

    (2)、StringBuilder 拼接

    (3)、StringBuffer拼接

    StringBuffer是保证线程安全的,效率是比较低的,我们更多的是使用场景是不会涉及到线程安全的问题的,所以更多的时候会选择StringBuilder,效率会高一些

    那么,问题来了,StringBuilder和“+”号拼接,哪个效率高呢?接下来我们通过字节码的方式进行探究。

    public class Test3 {
        public static void main(String[] args) {
            new Test3().m1();
            new Test3().m2();
        }
        public void m1(){
            String s1 = "123";
            String s2 = "456";
            String s3 = s1 + s2;
            System.out.println(s3);
        }
        public void m2(){
            String s1 = "123";
            String s2 = "456";
            StringBuilder sb = new StringBuilder();
            sb.append(s1);
            sb.append(s2);
            String s3 = sb.toString();
            System.out.println(s3);
        }
    }

    查看 Test3.class的字节码,从解字节码中可以看出, m1()方法源码中是使用+号拼接,但是在字节码中也被编译成了StringBuilder方式

    所以,可以得出结论,字符串拼接,+号和StringBuilder是相等的,效率一样。

    接下来,我们看一个案例:

    public class Test4 {
        public static void main(String[] args) {
            new Test4().m1();
            new Test4().m2();
        }
        public void m1(){
            String str = "";
            for (int i = 0; i < 5; i++) {
                str = str + i;
            }
            System.out.println(str);
        }
        public void m2(){
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 5; i++) {
                sb.append(i);
            }
            System.out.println(sb.toString());
        }
    }

    m1() 与 m2() 哪个方法的效率高?

    m1()方法中的循环体内,每一次循环都会创建StringBuilder对象,效率低于m2()方法。当用+号进行一次字符串拼接的时候都会new一个StringBuilder,循环5次就会new 5个StringBuilder对象。m2()方法中在循环体内并没有new StringBuilder对象,而是每次都是调用append方法,即在循环体外new了一次,在循环体内一直append,而new对象和销毁对象(垃圾回收)都会占用系统资源。

    总结:for循环中字符串拼接用StringBuilder

  • 相关阅读:
    word20170108逛景点 Sightseeing有用的词和句子
    c# List 分页问题
    VUE界面,this.form.xxx=1赋值后,界面效果没有变化
    SQL Server使用索引视图来实现“物化视图”
    .NET CORE 实现异步处理
    当请求接口提示网络错误Error:Network Error的时候
    SheetJS js-xlsx :js实现导出Excel模板
    增加索引分析
    聚集索引与非聚集索引的总结
    Dynamics CRM-无法识别安全令牌的颁发者,若要接受来自此颁发者的安全令牌,请将 IssuerNameRegistry 配置为返回此颁发者的有效名称
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15815568.html
Copyright © 2011-2022 走看看