java 的String和StringBuffer引用传递问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 的String和StringBuffer引用传递问题相关的知识,希望对你有一定的参考价值。
public class StrngBuffer_1
public static void main(String args[])
String a=new String("java");
StringBuffer b=new StringBuffer("java");
mb_method(a,b);
System.out.println(a+b);
public static void mb_method(String s,StringBuffer t)
s=s.replace("j","i");
t=t.append("C");
为什么输出为javajavaC而不是 iavajavaC,感觉是引用传递问题,但不知道怎么解释,请指点。谢谢。
s=s.replace("j","i");想要改变参数s的物理地址,即改变实参这是不被允许的
就好像如果参数类型是int,你对形参进行++或--以及=操作都是无效的,虽然不会报错
这里应该修改一下
public class StrngBuffer_1
public static void main(String args[])
String a=new String("java");
StringBuffer b=new StringBuffer("java");
a=mb_method(a,b);
System.out.println(a+b);
public static String mb_method(String s,StringBuffer t)
t.append("C");
return s.replace("j","i");
//你不能对参数做出=操作,但是可以靠返回值将处理后的结果返回程序
这跟final什么的没关系,java里就是这样,你用你自己写的类也是一样的结果,我直接给你举例说明吧
public class Main
public static void main(String[] args)
ObjectOne o=new ObjectOne(4,3);
fun(o);
System.out.println(o);
public static void fun(ObjectOne n)
ObjectOne s=new ObjectOne();
n=s;
class ObjectOne
private int x = 0;
private int y = 0;
public ObjectOne()
this.x=0;
this.y=0;
public ObjectOne(int x,int y)
this.x=x;
this.y=y;
public String toString()
return x+" "+y;
我们来看看这程序的输出结果:
4 3
结果是4 3,而不是0 0,这样你懂了吧
t=t.append("C");的这个操作并不是t=这里起作用了,而是t.append("C");这里起作用了,通过调用t的append()方法,修改了t的属性,而不是t=t.append("C")产生新对象后赋回实参地址了
你可以自己在ObjectOne中添加
public void setX(int x)
this.x=x;
并在主函数中比较一下
o=o.setX();和o.setX()有什么区别 参考技术A String是一个特殊的对象,例如String s = "a"; s = s + "b"; Java不会在s的原有对象中附加一个b。而是重新建立一个String对象“ab”,然后将s指向新的对象,而之前的"a”会继续呆在内存中。如果没有其他对象引用a。这在一段时间后,他会被垃圾收集机制收集处理。
而此例中,原本a和s指向的是同一个对象,因为你进行的replace操作,s就指向了新的String对象。而a指向的对象还是没有变化。
而StringBuffer是正常的传引用。
所以在很多的频繁变更String的场合下,不建议使用String,浪费内存。大家都用StringBuffer 参考技术B
String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。
如:String greeting=“Good Morning! \\n”;
String greeting=new String(=“Good Morning! \\n”);
String的特点是一旦赋值,便不能更改其指向的字符对象,如果更改,则会指向一个新的字符对象 。
StringBuffer是一个具有对象引用传递特点的字符串对象。
StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。
一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象。
以上是关于java 的String和StringBuffer引用传递问题的主要内容,如果未能解决你的问题,请参考以下文章
Java中的String和StringBuffer有啥区别?