String和StringBuilder的问题,请教各位

wuhuanhuan123 2011-06-26 10:31:09

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)里的,无论方法体是什么,它本身的值是不应该被改变的啊?
还请各位指教,在此谢过啦!
...全文
154 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞跃颠峰 2011-06-26
  • 打赏
  • 举报
回复
StringBuilder.append()改变了对象中的内容,这比较好理解。

关于
public static void stringReplace(String text) {
text = text.replace('j', 'l');
}
这里有两个知识点
1) String.replace()并不改变原字符串的内容,而是返回另一个字符串对象。
2) 参数text的生存周期仅限于方法内部,作为一个指向对象的引用,即使值被改变了,也不影响指向原对象的其它引用。所以stringReplace()方法对外部世界没有任何影响。
qybao 2011-06-26
  • 打赏
  • 举报
回复
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没有任何影响
goodsun00 2011-06-26
  • 打赏
  • 举报
回复
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);
}
wuhuanhuan123 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 alexandertech 的回复:]
StringBuilder.append()改变了对象中的内容,这比较好理解。

关于
public static void stringReplace(String text) {
text = text.replace('j', 'l');
}
这里有两个知识点
1) String.replace()并不改变原字符串的内容,而是返回另一个字符串对象。
2) 参数te……
[/Quote]

呵呵,谢谢,对String又多了一点了解
wuhuanhuan123 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qybao 的回复:]
text = text.append("c"); //关键在这里
先调用text.append("c"); //因为text和方法外的textBuffer指向同一个内存地址,所以append的时候,修改了textBuffer指向的内存地址的内容,所以textBuffer能看到修改的结果


text = text.replace('j', 'l'); //
调用text.replace……
[/Quote]
谢谢你哦,你说的比较深层次,我明白了
wuhuanhuan123 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodsun00 的回复:]
public static void stringReplace(String text) {
// 把textString的地址copy给text,text也指向了textString的"java"
// text.replace('j', 'i');的结果是"iava"
// text = text.replace('j', 'i');就是重新使text指向"ia……
[/Quote]
好像明白了一点了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧