• StringBuffer.append比String加号好在那里?


    转载自:http://www.4ucode.com/Study/Topic/1161684

    网上的JAVA面试题经常有两个String 字符串相加没有  StringBuffer.append();速度高

    但是很少有说明原因的。

    所以自己做了个小测试

    源代码1
    public class TestMain {

    public static void main(String[] args) {
    String test1="测试测试1";
    String test2="测试测试2";
    String test3=test1+test2;
    System.out.println(test3);    

    }
    }

    结果编译后的class  然后再反编译  发现 代码已经被默认优化成

    import java.io.PrintStream;   
    public class TestMain
    {
    public static void main(String args[])
    {
    String test1 = "测试测试1";
    String test2 = "测试测试2";
    String test3 = (new StringBuilder(String.valueOf(test1))).append(test2).toString();
    System.out.println(test3);
    }
    }

    源代码2

    public static void main(String[] args) { 
    String test1="测试测试1";
    String test2="测试测试2";
    StringBuffer test3=new StringBuffer();
    test3.append(test1);
    test3.append(test2);
    System.out.println(test3);   
    }

    先编译再反编译
    的结果跟以前一样

    结果:
    很明显 连个字符串 相加 最后都优化成了  StringBuilder的.append();
    查了一下源代码
    StringBuilder 类 和  StringBuffer 类都 继承于 AbstractStringBuilder

    public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

    {
    public synchronized StringBuffer append(String str) {
    super.append(str);
    return this;
    }
    }

    public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
    {
    public StringBuilder append(String str) {
    super.append(str);
    return this;
    }

    }

     
    而且都是调用AbstractStringBuilder

    public AbstractStringBuilder append(String str) {
    if (str == null) str = "null";
    int len = str.length();
    if (len == 0) return this;
    int newCount = count + len;
    if (newCount > value.length)
    expandCapacity(newCount);
    str.getChars(0, len, value, count);
    count = newCount;
    return this;
    }

    方法

    经过以上得到以下结论:
    所以 如果用加号相加两个字符串  比用StringBuffer.append() 方法多创建对象而且没有append线程安全。

    拼串频繁的方法建议参考以下实例:

    StringBuffer buffer = new StringBuffer();

    buffer.append(" 字段 like '%$").append(变量名).append("$%' ");

    sql = sql + " where aaa.domainId=" + domainId + " and (" + where;

    个人测试代码:

       String str = "";
           log.info("date--1---"+new Date());
           for(int j=1;j<=10000;j++){
            str = str + Integer.toString(j);
           }
           log.info("str.length()-----"+str.length());
           log.info("date---2--"+new Date());
          
           log.info("date---1--"+new Date());
           StringBuffer bf = new StringBuffer();
           for(int j=1;j<=10000;j++){
            bf.append(Integer.toString(j));
           }
           log.info("bf.length()-----"+bf.length());
           log.info("date---2--"+new Date());

     结果:

    date--1---Thu Mar 29 10:09:54 CST 2012
    str.length()-----41001
    date---2--Thu Mar 29 10:09:55 CST 2012
    date---1--Thu Mar 29 10:09:55 CST 2012
    bf.length()-----41001
    date---2--Thu Mar 29 10:09:55 CST 2012

     总结:在使用最简单的拼接字符串时,当字符串的最终length达到30000-40000级差别明显到秒级,建议在复杂sql拼接都使用StringBuffer.append("").

  • 相关阅读:
    2019.9.18 Unity3D与Android相互传递消息 & unity与ios相互传递消息
    2019.9.10 IEnumerable 详解C# 迭代器
    Windows Live Writer 之 代码快速插入插件
    目标管理剖析与实践– 献给追梦的人 (转)
    转:简历写法
    Linux下 输入 env 而得到的环境变量解读
    how to install tweepy
    全分布式环境下,DataNode不启动的问题解决
    几个因为hadoop配置文件不当造成的错误
    Hadoop: HDFS 格式化时,出现 “ERROR namenode.NameNode: java.io.IOException: Cannot create directory /usr/hadoop/tmp/dfs/name/current”
  • 原文地址:https://www.cnblogs.com/anuoruibo/p/2408033.html
Copyright © 2020-2023  润新知