`
laserdance
  • 浏览: 92143 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

StringBuilder StringBuffer and "+"

阅读更多
String字符串是Java中最常用的数据结构.
"+"在Java中已被String类重载.所以我们常见是用"+"来连接字符串.
如:
   String test = " the first number is " + 0;

在JDK5.0以后还提供一个类StringBuilder(JDK1.4中只提供了StringBuffer),它也可以提供类似"+"的功能.
[StringBuilder和StringBuffer的区别是前者是线程不安全的,后者是线程安全的,所以从效率上来说前者要比后者高]
StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中,
上面我们讨论了两者的区别.下面我们来比较StringBuilder和"+"的效率区别...
如果一个简单的字符串的拼接,应该说StringBuilder和"+"的效率是差不多的,因为在JVM编译过程中,它首先就是将"+"编译成StringBuilder的引用来append.
     public static void main(String[] args){
      String result = " hello" + "javaeye"+" " + 1234567890;
      System.out.println(result);
}

编译完后我们用Jad反编译/.class后我们可以看到所有的"+"号全被StringBuilder代替.
    String result = (new StringBuiler("hello")).append("javaeye").append(" ").append(1234567890).toString();

所以我们说在这种情况下使用"+"和使用StringBuiler效率差不多.我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。

但在for循环中我们再来测试一下二者的效率.
    String result = "";
    Random r = new Random();
    for(int i=0; i< 10;i++){
         result = result + r.nextInt(1000)+ "";
}
System.out.println(result);

此时我们会看到如下的情形:
   result = (new StringBuiler(String.valueOf(result))).append(r.nextInt(1000)).append(" ").toString();


虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:
   String result = "";
   Random r = new Random();
   StringBuilder sb = new StringBuilder();
  for(int i=0; i<10 ; i++){
    sb.append(r.nextInt(1000));
    sb.append("");
}
result = sb.toString();
System.out.println(result);


此外在循环中也不要和StringBuiler混用"+"号;以上代码在JDK5.0下测试通过.如果是JDK1.4,则将StringBuilder替换为StringBuffer().
总结:
如果在循环中尽量少用new对象来创建对象,这样会导致大量对象的创建,类似的地方还有:
伪代码
   int length = xxxList.size();
   for(int i=0;i<length;i++}{......}
   //和将得到length放到循环里取的性能就不一样
   for(int i=0;i<xxxList.size();i++){......}





分享到:
评论
1 楼 liuwenbo200285 2011-03-19  
学习了,面试的时候经常问这个问题,估计有的面试官也不知道如果不在循环中用“+”和StringBuiler差不多

相关推荐

    Java String、StringBuffer、StringBuilder(基于源码探索)

    `String`、`StringBuffer`和`StringBuilder`都是用于构建和操作字符串的类,但它们之间存在重要的差异。这些差异主要体现在对象的不可变性、线程安全性和性能方面。 首先,`String`类是最基础的字符串类,它的特点...

    java面试精选必备题集

    * String、StringBuilder、StringBuffer + String:不可变字符串 + StringBuilder:可变字符串,线程不安全 + StringBuffer:可变字符串,线程安全 * 重载和重写的区别 + 重载:同名方法,参数列表不同 + 重写...

    SQL转拼接代码

    在Java中,我们可以使用StringBuilder或StringBuffer类进行字符串拼接。例如,如果你有一个SQL插入语句,你可能会这样做: ```java StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO table_name ...

    Money And Date toChinese Java

    - 使用StringBuilder或StringBuffer进行字符串拼接,避免大量的字符串连接操作导致的内存开销。 8. **错误处理**: - 需要对输入数据进行有效性检查,如检查金额是否为合法的数字,日期是否符合格式等,并在出现...

    java面试第一部分:基础知识

    `StringBuffer`和`StringBuilder`可变,它们在内存中直接修改,`StringBuffer`在多线程环境下是线程安全的,`StringBuilder`则不是,但在单线程环境中性能优于`StringBuffer`。 7. **字符串反转**:可以使用`...

    JAVA面试题大全及答案

    在处理大量字符串拼接时,建议使用StringBuilder或StringBuffer以提高效率。 3. String与StringBuilder/StringBuffer: - String是不可变的,每次修改都会创建新的对象,消耗资源。StringBuilder/StringBuffer则...

    2011最新java面试题.doc

    - StringBuilder与StringBuffer都是可变的,它们用于构建和修改字符串,尤其是处理大量字符串操作时,比String更高效。StringBuffer是线程安全的,StringBuilder则不是。 4. 运行时异常与一般异常: - 运行时异常...

    java 面试大全(史上最全)

    - 在多线程环境下,`StringBuffer`是线程安全的,而`StringBuilder`不是,但在单线程环境中,`StringBuilder`的性能优于`StringBuffer`。 4. **运行时异常与一般异常**: - 运行时异常是程序运行时可能出现的常见...

    java细节优化代码1.0版本.7z

    4. **使用StringBuilder或StringBuffer**:在字符串拼接时,避免使用"+"运算符,因为每次连接都会创建新的字符串对象。StringBuilder和StringBuffer是线程安全的,适用于多线程环境,比直接使用"+"更快。 5. **方法...

    程序结合SQL语句结构,动态实现SQL多条件查询语句代码

    以Java为例,我们可以使用StringBuilder或StringBuffer来构造SQL语句。在程序中,我们可以先定义一个基础的SQL模板,然后根据需要添加WHERE子句的条件。例如: ```java String sql = "SELECT * FROM table_name "; ...

    Java源码海量字符串的快速操作.rar

    两者的区别在于线程安全性:`StringBuilder`是非线程安全的,而`StringBuffer`是线程安全的,但在线程不安全的场景中,`StringBuilder`通常有更好的性能。 3. **HashSet与HashMap** 当需要快速查找某个字符串是否...

    Java面试宝典Beta5.0.pdf

    String、StringBuilder和StringBuffer是用于字符串操作的类,其中String是不可变的,而StringBuilder和StringBuffer是可变的,StringBuffer比StringBuilder更慢但线程安全。 18. Java的数据类型:Java的基本数据...

    java面试笔试题大汇总

    `StringBuilder`和`StringBuffer`在内存中可变,适合大量字符串操作,尤其在多线程环境中使用`StringBuilder`(单线程)或`StringBuffer`(多线程)能提高性能。 4. **运行时异常与一般异常**:运行时异常是程序...

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    StringBuffer sql = new StringBuffer("SELECT id, name, department, leader FROM employee WHERE 1=1"); if (name != null && name.trim().length() &gt; 0) { sql.append(" AND name='" + name.trim() + "'"); } if...

    ava and related books 3\Java 2 - The Complete Reference

    - 详细介绍了 Java 中字符串的操作方法,包括 StringBuilder 和 StringBuffer 类。 - **第十四章:探索 java.lang 包**(Exploring java.lang) - 讲解了 java.lang 包中的核心类和接口,如 Object、String、Math ...

    程序员--java面试100题目

    - **StringBuilder/StringBuffer**:可变对象,适合大量字符串操作,多线程环境下使用StringBuffer,单线程环境下StringBuilder效率更高。 4. **异常处理**: - **运行时异常**:如ArithmeticException,程序运行...

    27个java常用的工具类

    12. **StringBuilder and StringBuffer**: 都是用来处理字符串的类,区别在于线程安全。`StringBuilder` 在非多线程环境下性能更好,`StringBuffer` 在多线程环境下更安全。 13. **System**: 提供了与系统相关的...

    1.总 面试题.pdf

    1. **执行速度**:`StringBuilder`相比`StringBuffer`更快,因为在`StringBuilder`中未实现同步机制,因此在单线程环境中性能更优。 2. **线程安全性**:`StringBuilder`是线程非安全的,而`StringBuffer`是线程安全...

    java插值.rar

    2. **StringBuilder或StringBuffer**:对于大量字符串拼接,可以使用`StringBuilder`或线程安全的`StringBuffer`,通过`append()`方法动态添加内容。例如: ```java StringBuilder sb = new StringBuilder(); sb...

Global site tag (gtag.js) - Google Analytics