public class Test {
public static void stringReplace(String text) {
text = text.replace('j', 'l');
} public static void bufferReplace(StringBuilder text) {
text = text.append("c");
} public static void main(String args[]) {
String textString = new String("java");
StringBuilder textBuffer = new StringBuilder("java");
stringReplace(textString);
bufferReplace(textBuffer);
System.out.println(textString + textBuffer);
}
} what is the output? 
Answer:javajavac
不是很明白,StringBuilder textBuffer 这个变量是作为参数传到方法bufferReplace(StringBuilder text)里的,无论方法体是什么,它本身的值是不应该被改变的啊?
还请各位指教,在此谢过啦!

解决方案 »

  1.   

        public static void stringReplace(String text) {  
            // 把textString的地址copy给text,text也指向了textString的"java"  
            // text.replace('j', 'i');的结果是"iava"  
            // text = text.replace('j', 'i');就是重新使text指向"iava"  
            // 由于该方法的返回类型是void,所以原来的textString没变  
            text = text.replace('j', 'i');  
            System.out.println(text);  
        }  
      
        public static void bufferReplace(StringBuffer text) {  
            // textBuffer的地址copy给text  
            // 然后沿着text指向的字符串(其实也就是textBuffer指向的对象)操作,添加一个"C"  
            // 虽然没有任何返回,但是这个操作影响到了textBuffer所指向的字符串  
            // 所以上个方法打印"java",这个方法打印"javaC"  
            text = text.append("C");  
            System.out.println(text);  
        }  
      

  2.   

    text = text.append("c"); //关键在这里
    先调用text.append("c"); //因为text和方法外的textBuffer指向同一个内存地址,所以append的时候,修改了textBuffer指向的内存地址的内容,所以textBuffer能看到修改的结果而
    text = text.replace('j', 'l'); //
    调用text.replace('j', 'l')的时候,text虽然和方法外的textString指向同一个内存地址,但是这个方法本身不是去修改它们指向的内存地址的内容,而是读取它们指向的内存地址的内容,然后新生成一个对象,把该对象的j换成l,然后把新生成对象的地址赋给text,所以textString没有任何影响
      

  3.   

    StringBuilder.append()改变了对象中的内容,这比较好理解。关于
        public static void stringReplace(String text) {
            text = text.replace('j', 'l');
        }
    这里有两个知识点
    1) String.replace()并不改变原字符串的内容,而是返回另一个字符串对象。
    2) 参数text的生存周期仅限于方法内部,作为一个指向对象的引用,即使值被改变了,也不影响指向原对象的其它引用。所以stringReplace()方法对外部世界没有任何影响。
      

  4.   


    呵呵,谢谢,对String又多了一点了解