`
576699909
  • 浏览: 6316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

StringBuffer.append比String加号好在那里?__原创

阅读更多
网上的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线程安全。



分享到:
评论
1 楼 samsongbest 2012-04-20  



相关推荐

    纯手工js数据交互

    stringbuffer.append(" "); // 依次将相应的字符转化成空格 break; case 10: // '\n' stringbuffer.append(" "); // 依次将相应的字符转化成空格 break; case 32: // ' ' ...

    api_StringBuffer.zip_fullvgv_java_tasteazi

    java中api中StringBuffer类中的基本方法的实现,包括一些基本方法的源码

    Java StringBuffer & StringBuilder.pdf

    它们与String类类似,但是不同之处在于,StringBuffer和StringBuilder可以修改字符串内容,而String对象是不可变的; StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程...

    String、StringBuilder和StringBuffer的区别

    String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别

    String,StringBuffer,StringBuilder区别

    String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的

    String,StringBuilder,StringBuffer.xmind

    String,StringBuilder,StringBuffer

    fastjson-1.2.7.jar通用json文本解析实例(轻开IOS和安卓App服务器开发)

    b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).append(".").append(String.valueOf(j)).toString()); } else{//如果下级是如果是文本或值,就放进书包 ...

    StringBuffer和String_区别

    StringBuffer和String_区别 java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的...

    JavaCrawler

    public static String sendGet(String url, Map<String, String> parameters) { String result=""; BufferedReader in = null;// 读取响应输入流 StringBuffer sb = new StringBuffer();// 存储参数 String ...

    sql访问数据库工具类--SqlUtils(java源码)

    buffer.append("SELECT ").append(this.getBeanShortName()).append( " FROM ").append(this.getBeanName()).append(" ").append( this.getBeanShortName()).append(" ").append(buildWhereStr()) ....

    javaString 和StringBuffer的区别

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据....当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers来动态构造字符数据.

    ssh多条件查询

    StringBuffer hql=new StringBuffer(); hql.append("from FinancialProduct fp where 1=1"); if(f.getProductType()!=null){ hql.append("and fp.productType='").append(f.getProductType()).append("'");...

    String StringBuffer和StringBuilder区别之源码解析

    String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证

    String和StringBuffer深入.doc

    String和StringBuffer深入.doc

    什么是软件测试ppt

    private void collect(String stu,String val,HttpServletResponse response) throws IOException{ StringBuffer buffer=new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?><result>"); buffer....

    简单易用的自定义标签分页显示

    sb.append("function goPage(cpage){").append("window.location='").append(action); sb.append("?currentPageNum='+").append("cpage"); sb.append("+'&onePageMaxNum='+").append("getMaxNum()"); sb.append...

    【IT十八掌徐培成】Java基础第10天-01.字节集-编解码操作-中繁体-StringBuffer.zip

    【IT十八掌徐培成】Java基础第10天-01.字节集-编解码操作-中繁体-StringBuffer.zip

    String和StringBuffer的区别

    String的效率低于StringBuffer,开发时最好选用StringBuffer。

    浅谈js中StringBuffer类的实现方法及使用

    如下所示: <strong>JAVA中有一个StringBuffer类,js中却没有下面来自己实现一个简单的js的...StringBuffer.prototype.append = function(str) { this.__strings__.push(str); }; StringBuffer.prototype.

    jsvm2框架源码

    StringBuffer.prototype.append = function (str){ this._strings_.push(str); } /** * 返回真正连接成的字符串 */ StringBuffer.prototype.toString = function(){ return this._strings_.join(""); ...

Global site tag (gtag.js) - Google Analytics