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)里的,无论方法体是什么,它本身的值是不应该被改变的啊?
还请各位指教,在此谢过啦!
// 把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);
}
先调用text.append("c"); //因为text和方法外的textBuffer指向同一个内存地址,所以append的时候,修改了textBuffer指向的内存地址的内容,所以textBuffer能看到修改的结果而
text = text.replace('j', 'l'); //
调用text.replace('j', 'l')的时候,text虽然和方法外的textString指向同一个内存地址,但是这个方法本身不是去修改它们指向的内存地址的内容,而是读取它们指向的内存地址的内容,然后新生成一个对象,把该对象的j换成l,然后把新生成对象的地址赋给text,所以textString没有任何影响
public static void stringReplace(String text) {
text = text.replace('j', 'l');
}
这里有两个知识点
1) String.replace()并不改变原字符串的内容,而是返回另一个字符串对象。
2) 参数text的生存周期仅限于方法内部,作为一个指向对象的引用,即使值被改变了,也不影响指向原对象的其它引用。所以stringReplace()方法对外部世界没有任何影响。
呵呵,谢谢,对String又多了一点了解