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,感觉是引用传递问题,但不知道怎么解释,请指点。谢谢。

java中不能对参数做出任何赋值操作,即=操作不行
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对象。

参考技术C 这个不会涉及到引用传递建议你去看看《effective java》里面对于字符串的操作有详解,而且能解决你这个问题。在JDK里面string被定义为final的即a是不可改变的,你将a的引用改变了,于是重新生成了一个string对象,即s,而你又没有把s赋给a(虽然a是不可变的但是可以重新复值得,只是赋值又会重新生成一个对象而已,原来还是没变,符合final的语意); 参考技术D String 字符串常量,简单来说String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。在你这段代码中用到的还是原来的对象,是没有改变的,你只是生成了一个新的对象"iava",但是没有引用。

以上是关于java 的String和StringBuffer引用传递问题的主要内容,如果未能解决你的问题,请参考以下文章

Java中的String和StringBuffer有啥区别?

java中关于String和StringBuffer的问题与解析

JAVA基础篇—String和StringBuffer

在java中String和StringBuffer的区别

Java中的StringBuffer

Java中的String类与StringBuffer类