A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张向辉 于 2013-2-5 12:20 编辑

众所周知,String的+运算符在进行字符串运算时,首先将当前的字符串对象转换为StringBuff 类型,调用其append方法,最后再将生成的StringBuff 对象通过其toString 方法转换为String类型的字符串,所以其效率要低。但是在可读性上,还是String的连接运算符要高。但是有一点我不明白,String是不可以修改的字符串对象,而StringBuff是可以修改的。求高手给出个例子 分别用以上两种不同的运算方式给出程序代码说明一下 越详细越好!

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

3 个回复

正序浏览
     我专门写了一篇关于String的日志,你可以去看看。在此可以简单地阐述一下。String是不可变类,String的字符串一旦创建时不可以修改的。我们通常看到的修改时一个假象,其实是在堆内存里产生了另外一个字符串对象,之前的对象失去了引用。在创建String字符串使用的“+”,如果是首次赋值时,涉及到运算,例如String a="keyee"+" sfds"+"ds"+1;尽管它连接了3个字符串和1个整数,但是分配空间时只存储了运算后的值,只产生了一个"keyeesfdsds1"的字符串对象在堆内存中。如果后续地你要修改a,采用a=a+"dsfs"的形式,其实和StringBuffer的append方法的差别就在于String会产生新的字符串对象,而StringBuffer则直接回修改堆内存中的字符串内容,并没有生成新的字符串。StringBuffer在字符串需要不断变更的情形时非常有利的,不会产生许多只是临时使用的字符串对象,对于有效规划内存非常有帮助。如果你想了解更多关于String的知识,也可以看看我的日志。日志的博客地址是:http://www.eoeandroid.com/blog-762066-6639.html。请多多相互交流。
   

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
所谓String是不可以修改的字符串对象是这么个意思,当你创建一个String对象后(在栈内存中一个变量指向堆内存中的对象时),堆内存中的对象不能够改变,例如String str = "abc"; 你如果再使用str = str + "123"时,String已经不是原来的那个对象了,而是一个全新的String对象,该对象的值是abc123,而如果你使用StringBuffered和StringBuilder的
append()方法,则该方法不会重新创建一个对象,而是在原String对象的后面加上你指定的内容,看下面一段代码
  1. public class TestStringBufferedAndString {
  2.         public static void main(String[] args) {
  3.                 String str = "abc";
  4.                 String str1 = str;
  5.                 str = str + "123";
  6.                 System.out.println(str == str1);        //打印结果为false,地址值不同,与原来不是同一个对象
  7.                 StringBuffer sb = new StringBuffer("cdf");
  8.                 StringBuffer sb1 = sb;
  9.                 sb.append("ghi");
  10.                 System.out.println(sb == sb1);                //打印结果为true,地址值相同,没有重新创建对象
  11.         }
  12. }
复制代码
总结:String是不可以修改的字符串对象,指的是String对象一旦创建,堆内存中的对象就不能改变,但没说不能改变栈内存中的引用,改变后的引用指向新创建的对象

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
代码。。。就是你说的那样,不知道怎么表现。
我想说的是,String+String,内部过程是你说的那样,但是最后得到的那个String,就又是一个新的String了,如果不考虑享元的话(注意享元的话,不能是变量相加)。
而StringBuffer是可变字符串,你怎么修改,它始终都是一个对象,当你需要打印的时候,你用toString()方法,就转换成了字符串,这又是一个新的String了。这个不存在享元的情况。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马