String 是定长字符串,一旦被付值后,长度将不能改变。而StringBuffer是变长字符串,所以长度可以改变。
那你一定不理解如下的:
String a="abcd";
a=a+"ef";
其实上面的在对a重新付值时,已经把a指向了a+"ef"所在的内存地址。而不是原来a 所在的地址了。

解决方案 »

  1.   

    上面的问题是scjp考试中,必出现的考题
      

  2.   

    这跟两点有关
    一个是关于java的函数到底是传值还是传地址
    一个是关于对象的
    首先肯定的是:java是传值的,但你的这两个函数是传的两个对象,而对象是没有值 的,所以相当于传的是句柄,对于string对象来说,定义了之后,在内存中的值是不可以再改变的,一旦改变,就会新建一个string对象来容纳新的值,也就是产生了一个新的对象,而对于stringbuffer来说,本身是可以改变的,你执行了那步append的操作之后,那个对象本身的句柄并没有发生改变,所以在函数里面的变化就想当于在外面的操作,而string对象的那步操作,传进去的是一个对象,而 改变之后是另一个对象,那么函数体完成之后,能够  显示  出来的当然只是你开始的对象,改变之后的对象出来后是看不到 的
    以上的解释应该满意了吧
      

  3.   

    可是String类中有一个replace方法啊,请问这个要怎么用啊,既然不能改变。再说了,我不是改变长度,而是其中的字符嘛,不是跟数组一个道理吗?期待解答
      

  4.   

    String类型的值是不能改变的,当你给它赋新值的时候,实际上是产生了一个新的String对象,用原来的String句柄来引用。但当从函数返回时,虽然对于对象来说,函数的参数传递的是引用,但它是按值来传递的,所以作为参数的String句柄又指向了原来的String对象,所以值没变。
      

  5.   

    其实很多String操作如+就是先转化为StringBuffer进行操作再转为String,所以如果大量的字符串操作的话,尽量用后者。
      

  6.   

    namowen(寒号不已)说的很对,stringReplace()返回String,直接return text就得了。我不要分了,只是最近无聊,来看看玩玩学学。
      

  7.   

    java除了基础类int等之外,全部对象作参数传递都是按引用传递的!String不是基础类,但它是个很特殊的class,它表现为按值传递,事实上本质上还是按引用传递的,namowen(寒号不已) 解释得很清楚
      

  8.   

    text = text.append ("C"); 等价于text.append ("C"); 

    text = text.replace ('j' , 'i'); 和text.replace ('j' , 'i'); 
    却是不一样的
      

  9.   

    基本类型是按值传递的,对象是传引用的。
    基本类型好像有8个:
    int,boolean,byte,char,double,foat,long,String虽然是一个类,好像也是作为基本类型看的,其它的都是对象。
      

  10.   

    public static String stringReplace (String text)  {
          text = text.replace ('j' , 'i');
          return text;
    }
    现在你再用这个方法就会起作用了
      

  11.   

    可以这样理解吗?text是一个引用,一个String对象的引用,假定这个引用对应的地址为000000,值为"java".在text=text.replace('j','i')之后,产生了一个新的String对象的值,假定这个值存在的地址为000001,现在text为000001的一个引用。但为什么函数返回的值没变呢,是因为此函数按值传递,000000的值并未改变,于是函数返回的值就不变了