大家都知道String类和StringBuffer类的区别,String一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。因此我们得出结论:当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,将最后结果转化成String类对象返回,这样效率会高很多。
但我有一个疑问,既然StringBuffer的效率比String高,sun为什么不把String类的所有方法赋予StringBuffer类,用StringBuffer类来代替String类呢?
请给我一个String类存在的理由,不要说String类可以使用+连接符操作字符串。难道sun就不能让StringBuffer类也实现这个功能?
或者让String类和StringBuffer类合而为一?

解决方案 »

  1.   

    必定StringBuffer有缓存的,如果你声明一个字符串只是接收传过来的参数,然后进行业务逻辑处理,那么假如你用很多个StringBuffer类型的对象,就比较浪费内存。这样用String就更好。
      

  2.   

    String的内容不能改变,使String更近似于基本类型数据(如int,double等),在参数传递中使用传值方式,提高效率~
    StringBuffer(StringBuilder)其实可以看做“基本数据类型”String的包装类(Wrapper),
    就像int与之对应的Integer等关系~(他们的关系不是完全相同,但在这点是一样的!)用StringBuffer取代String,其实就相当于Integer取代int,你认为利大于弊还是利小于弊呢!~
      

  3.   

    也是,java中还没有 操作符 重载,c#中就可以实现
      

  4.   

    String +String
    用:javac -c Demo你可以看到他里面用的是StringBuilderStringBuilder比StringBuffer快。没有StringBuffer安全。
      

  5.   

    String : 常量字符串,可以使用栈存储,速度快,简单应用效率高。
    StringBuilder : 可变字符串构造器,典型的对象,堆中创建,如楼主所说频繁的修改字符串如果使用String就会产生很多对象,反而降低了效率。
    StringBuffer :同StringBuilder,但是是线程安全的,所以效率略低于StringBuilder。编程中很大部分是在对字符串处理,所以java就提供大量的字符串操作以适应不同的环境和需求。
      

  6.   

    String的内容不能改变,使String更近似于基本类型数据(如int,double等),在参数传递中使用传值方式,提高效率~ 
    StringBuffer(StringBuilder)其实可以看做“基本数据类型”String的包装类(Wrapper), 
    就像int与之对应的Integer等关系~(他们的关系不是完全相同,但在这点是一样的!) 用StringBuffer取代String,其实就相当于Integer取代int,你认为利大于弊还是利小于弊呢!~ 
      

  7.   

    当然不能取消了。
    如果你想定义一个字符串,但是不想它被修改,你能用stringBuffer么?????你的stringBuffer能用append()方法么????他俩只是为了解决字符串的问题。不想被修改的,用string,需要连接的用vstringBuffer.
      

  8.   

    多谢各位的解释。但我对答案还不是很满意。StringBuffer类的优点为什么不能直接移植到String类上呢?
    比如。
    String s1 = "a",s2 = "b";
    s1 = s1 + s2;
    这里s1+s2是一个新的内存对象。但是sun为什么不能象C++那样重载运算符。让s1+s2就像是s1.append(s2)呢?
    为什么呢?"用StringBuffer取代String,其实就相当于Integer取代int,你认为利大于弊还是利小于弊呢!"
    我正想请问提出此论点的朋友,Integer是类int不是。而StringBuffer和String都是类。它们应该不是一个类型的问题。当然也是我迷惑的地方。希望能解释的再深层次一些。
      

  9.   

    那有没有想过String或stringbufer底下又是怎么实现的呢,还不是通过精心的算法来操一个一个字符(或讲的更狠点是字节)来完成的.所以关于String
    或stringb那只是人家写好的一个类我们跟着用就行了.如果觉得不太好用的话可以自己设计一个工具类来用一下.
    所以关于这个问题谈深了就没意思了.