都说StringBuffer效率高,那么在任何时候都是StringBuffer的效率高吗?有没有一种情况下String的效率要比StringBuffer的效率高呢?请大家畅所欲言~

解决方案 »

  1.   

    String既属于引用类型也属于基础数据类型,而且内容是静态的,在通常情况效率高些   
      但如果涉及到连接字符串的时候,对于String每次连接都要重新分配内存,因此StringBuffer好些   
      总之,对于静态处理,如:储存字符串,用String   
      动态改变字符串内容则使用StringBuffer
      

  2.   

    3.6.5 检测字符串是否相等
    可以使用equals方法检测两个字符串是否相等。
    如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
    否则返回false。
    需要注意,s与t可以是字符串变量,也可以使字符串常量。
    一定不能使用==运算符检测两个字符串是否相等!
    这个运算符只能够确定两个字符串是否被放置在同一个位置。
    当然,如果字符串放在同一个位置,他们必然相等。
    但是,完全有可能将内容相同的两个字符串放在不同的位置上。
    如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
    但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
    因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
    From《Java2核心技术第七版卷I,基础知识,Page49》
    String:字符串常量,JVM共享,但不可更改
    StringBuffer:内容可变字符串,JVM不共享(大多数时候),内容可改变
      

  3.   

    说StringBuffer比String高是指在进行字符串相加操作的时候,尤其是大量拼接字符串的时候。
    类似
    String s = "";
    StringBuffer b = new StringBuffer();
    for(int i = 0; i < len; i++) {
        s += i;
        b.append(i);
    }这样的代码,b.append的效率远远比String相加快得多,这是因为append不需要每次都复制一次原来字符串的值。如果你的StringBuffer不需要在多线程中共享使用,应该使用StringBuilder,这个线程不安全,但是更高效
      

  4.   

    JDK API字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如: 
         String str = "abc";
     等效于: 
         char data[] = {'a', 'b', 'c'};
         String str = new String(data);
     下面给出了一些如何使用字符串的更多示例: 
         System.out.println("abc");
         String cde = "cde";
         System.out.println("abc" + cde);
         String c = "abc".substring(2,3);
         String d = cde.substring(1, 2);
     String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。大小写映射基于 Character 类指定的 Unicode 标准版。 Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。有关字符串串联和转换的更多信息,请参阅 Gosling、Joy 和 Steele 合著的 The Java Language Specification。 除非另行说明,否则将 null 参数传递给此类中的构造方法或方法将抛出 NullPointerException。 String 表示一个 UTF-16 格式的字符串,其中的增补字符 由代理项对 表示(有关详细信息,请参阅 Character 类中的 Unicode 字符表示形式)。索引值是指 char 代码单元,因此增补字符在 String 中占用两个位置。 String 类提供处理 Unicode 代码点(即字符)和 Unicode 代码单元(即 char 值)的方法。 
      

  5.   

    String和StringBuffer的主要区别是,对一个String变量的改变会不断的开辟内存空间的,用新的内存空间去保存新的String值,这样会造成系统资源的不必要浪费,StringBuffer是可变的字符串,它对字符串的操作才是真正的去修改原有字符串。
      

  6.   


    String str="";
    StringBuffer sb=new StringBuffer();
    long start=System.currentTimeMillis();
    for (int i = 0; i < 900; i++) {
        str=str+"d";
    }
    System.out.println(System.currentTimeMillis()-start+"String");
    long start1=System.currentTimeMillis();
    for (int i = 0; i < 700; i++) {
        sb.append("a");
    }
    System.out.println(System.currentTimeMillis()-start1+"StringBuffer");
    //用事实说话.