一道基本题,有点疑问 本帖最后由 ayds1984 于 2009-08-14 09:47:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 String是不可变字符串StringBuffer是可变字符串 String不可变,stringReplace方法只是重新创建了另一个String对象,你原来的不变。StringBuffer可变,所以可以在原来的基础上修改。 我明白了,其实bufferString = bufferString.append("C");和bufferString.append("C");效果一样哈哈,结贴了,没想过来哈哈 String中修改字符串的方法都是产生新的对象,这跟String的实现有关StringBuffer.append方法是在当前对象后追加 stringReplace:,参数相当于一个局部变量,其作用域和生命期就是stringReplace方法内部,所以局部变量实际上是被隔离的,方法体就是一个隔离区,与方法以外的同名变量是两个不同的个体,互不影响。所以对参数的修改不会影响到方法以外和参数同名的变量。如例子中的方法参数textString,在方法中对做了修改,但这个参数在方法结束后,被释放了。对外部没有任何影响。stringBufferReplace:与上面不同,这个方法中并没有对参数做修改,而是对参数这个引用所指向的内容做了修改。被修改的内容是由两个引用指向的,一个是实际参数(main中的bufferString),一个是形式参数(stringBufferReplace方法的参数bufferString),用其中的一个引用对内容所修改,必然所影响到另一个。 首先这两个方法都是传递对象引用 private static void stringReplace(String textString){ textString = textString.replace("j", "i"); } 这个方法会让textString指向一个新的对象,而不是改变它的指向对象的状态(因为String是不可变的所以不能修改它的内部状态),这种通过对象引用作为方法参数指向新对象在JAVA中是不允许的,所以有很多大师都把此视之为JAVA只有值传递private static void StringBufferReplace(StringBuffer bufferString){ bufferString = bufferString.append("C"); }而这个方法的参数是StringBuffer的引用,可见方法内将这个引用指向的对象的状态进行了操作,即将它的值添加了C这个字符串,那么这个字符串的内容就变成了javaC了,可见将引用赋值给新对象是不可行的,但是改变对象的属性是可以的。 你就算只写bufferString.append("C");它也是javajavaC 如何删除list中的重复值 一个反射的小问题 关于List中除去重复元素 方法实参传递的疑惑!! 急!急!急!-------->關於String的問題 有若干个点,怎么把它形象的表示出来(二维曲线或者饼状图),有谁有这样的绘图类 用jexcel API怎样往现有的workbook中插入sheet? 大家帮我找一个错误好吗? 请看一个程序 请教高手,Applet能否把浏览器的菜单栏、地址栏、工具栏、状态栏等都去掉? 如何把int数组里面的元素转成String? 出了个小错误找不出来
StringBuffer是可变字符串
StringBuffer可变,所以可以在原来的基础上修改。
和bufferString.append("C");效果一样哈哈,结贴了,没想过来哈哈
private static void stringReplace(String textString){
textString = textString.replace("j", "i");
} 这个方法会让textString指向一个新的对象,而不是改变它的指向对象的状态(因为String是不可变的所以不能修改它的内部状态),这种通过对象引用作为方法参数指向新对象在JAVA中是不允许的,所以有很多大师都把此视之为JAVA只有值传递private static void StringBufferReplace(StringBuffer bufferString){
bufferString = bufferString.append("C");
}
而这个方法的参数是StringBuffer的引用,可见方法内将这个引用指向的对象的状态进行了操作,即将它的值添加了C这个字符串,那么这个字符串的内容就变成了javaC了,可见将引用赋值给新对象是不可行的,但是改变对象的属性是可以的。