`
576699909
  • 浏览: 6555 次
  • 性别: 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  



相关推荐

    重载重写、接口、抽象类、String指针和字符串拼接、异常catch、throw、throws、字符流和字节流

    sb.append("Hello").append(" ").append("World"); String str = sb.toString(); ``` ### 异常处理 1. **catch**:在try-catch语句块中用来捕获异常的关键词。当try块中的代码抛出异常时,控制权转移到与该异常...

    Int_Str_Conversion.rar_conversion

    或者使用`StringBuilder`或`StringBuffer`类: ```java int num = 123; StringBuilder sb = new StringBuilder(); sb.append(num); String strNum = sb.toString(); ``` 3. **JavaScript**: JavaScript中...

    JS 拼凑字符串的简单实例

    在JavaScript(JS)编程中,拼接大量字符串时,直接使用加号 (+) 运算符可能会导致性能问题,因为每次运算都会创建新的字符串对象。为了解决这个问题,我们可以借鉴Java中的`StringBuffer`概念,利用JavaScript的...

    javascript中字符串拼接详解

    StringBuffer.prototype.append = function (str) { this.__strings__.push(str); return this; // 便于链式操作 } StringBuffer.prototype.toString = function () { return this.__strings__.join(""); } ```...

    某公司java笔试选择题含答案.docx

    9. 字符串连接:在Java中,可以使用加号操作符 `+`、`concat()` 方法或 `StringBuffer` 的 `append()` 方法连接字符串,答案是A. `s2 + s1`、B. `s1.concat(s2)` 和D. `StringBuffer buf = new StringBuffer(s1); ...

    java性能优化

    使用 `StringBuffer` 或 `StringBuilder` 类来替代加号 (`+`) 进行字符串拼接,可以显著减少对象的生成次数。例如,上述代码可以优化为: ```java StringBuffer name = new StringBuffer("HuangWeiFeng"); System....

    java中stringBuilder的用法.pdf

    当需要频繁修改字符串时(如在循环中拼接字符串),使用StringBuilder相比于使用String的concat方法或者加号操作符,可以减少创建新的String对象,从而降低内存消耗,提高程序运行效率。 知识点概述: 1. ...

    保持代码健壮性的小技巧

    直接使用加号(`+`)进行字符串连接会在每次操作时创建新的字符串对象,这在循环中尤其低效。为了提高效率,可以使用`StringBuilder`或`StringBuffer`。`StringBuilder`在多线程环境中不安全,而`StringBuffer`提供...

    JAVA 基础题

    5. **使用 `StringBuilder` 或 `StringBuffer`**:这些类提供了创建和修改字符串的更高效的方法。 ```java StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(", World!"); String str =...

    北大青鸟JAVA测试北大青鸟JAVA测试北大青鸟JAVA测试北大青鸟JAVA测试

    - 因为 `StringBuffer` 是可变的,而 `String` 是不可变的,所以在执行 `append` 操作时会将 `sb` 的内容修改为 `"HelloMYFRIEND"`,然后转换成小写输出为 `"hellomyfriend"`。 ### 5. 变量类型和引用 - **基本...

    作业:ДЗ5.КонкатенацияДЗ4.Класс狗

    StringBuilder 和 StringBuffer 都提供了append方法用于添加字符串,它们在内存管理上更高效,尤其在处理大量字符串连接时。StringBuffer 是线程安全的,适合多线程环境,而StringBuilder则没有线程安全的额外开销,...

    我的面试题目.doc

    反之,将整数转换为字符串,可以使用String.valueOf()、Integer.toString()或直接加号操作("" + i)。 **int与Integer的区别** int是Java的原始数据类型,而Integer是int的封装类。原始类型占用的内存少,访问...

    JavaBootCampWeek1:数组、循环、字符串缓冲区

    相比于直接使用加号(+)拼接字符串,使用`StringBuffer`或`StringBuilder`在处理大量字符串操作时性能更优,特别是在循环中。 综上所述,JavaBootCamp的第一周课程涵盖了数组的创建、遍历和操作,循环结构的使用...

    javascript 字符串连接的性能问题(多浏览器)

    `StringBuffer`类包含一个字符串数组,并提供了`append`方法用于添加字符串,以及`toString`方法用于将所有字符串合并为一个单一的字符串。这个类的主要目的是避免频繁的字符串连接操作,尤其是在循环中。 在Fire...

    字符串缓冲区

    它们提供了线程安全(`StringBuffer`)和非线程安全(`StringBuilder`)的字符串操作方法,如`append()`、`insert()`、`delete()`等。这些方法允许我们在已有字符串基础上进行拼接和修改,而无需每次都创建新的字符...

Global site tag (gtag.js) - Google Analytics