java 的String和StringBuffer引用传递问题

2024-12-16 16:54:41
推荐回答(5个)
回答1:

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()有什么区别

回答2:

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

回答3:

  • String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。
    如:String greeting=“Good Morning! \n”;
    String greeting=new String(=“Good Morning! \n”);
    String的特点是一旦赋值,便不能更改其指向的字符对象,如果更改,则会指向一个新的字符对象 。

  • StringBuffer是一个具有对象引用传递特点的字符串对象。
    StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。
    一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象。

回答4:

这个不会涉及到引用传递建议你去看看《effective java》里面对于字符串的操作有详解,而且能解决你这个问题。在JDK里面string被定义为final的即a是不可改变的,你将a的引用改变了,于是重新生成了一个string对象,即s,而你又没有把s赋给a(虽然a是不可变的但是可以重新复值得,只是赋值又会重新生成一个对象而已,原来还是没变,符合final的语意);

回答5:

String 字符串常量,简单来说String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。在你这段代码中用到的还是原来的对象,是没有改变的,你只是生成了一个新的对象"iava",但是没有引用。