3、String 、StringBuffer、StringBuild 在传递过程中的区别

Java String与StringBuffer深入解析
本文详细对比了Java中String与StringBuffer的使用特性,分析了两者在内存中的存储方式,以及它们在操作过程中的行为差异。通过具体示例说明了String的不可变性和StringBuffer的可变性,以及如何正确使用这些类来提高代码效率。

1、看下面一段程序,对比区别

public class StringTest {
    public static void main(String[] args) {
        String aString = "helloword";
        String bString = "helloword";
        String aStringTmp = aString.replace('h', 'd');  //原来的aString不变
        System.out.println(aString);
        //经过jdk编译优化后,使得astring 和 bstring 都是指向了同一个内存空间。
        System.out.println(aString == bString);  //true

        String aString2 = new String(aString);
        String bString2 = new String(bString);
        //由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同,
        //aString2 == bString2比较的是地址引用,所以不相等
        //aString2.equals(bString2)比较的是值,所以值相等。
        System.out.println(aString2 == bString2);  //false
        System.out.println(aString2.equals(bString2)); //true  (比较的是值)

        StringBuffer aStringBuffer = new StringBuffer("helloword");
        StringBuffer bStringBuffer = new StringBuffer("helloword");
        //由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同,

        //aStringBuffer == bStringBuffer比较的是地址引用,所以不相等
        System.out.println(aStringBuffer == bStringBuffer); //false  引用比较
        System.out.println(aStringBuffer.equals(bStringBuffer));  //false  还是引用比较
        //转化为字符串后在进行比较就可以了。
        System.out.println(aStringBuffer.toString().equals(bStringBuffer.toString()));


        appengd(aStringBuffer, bStringBuffer);
        System.out.println(aStringBuffer  + "  " + bStringBuffer);
    }

    public static void changeForString(String a,String b){
        //由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象
        //因而a = a+b;这句话的意思是:将a、b的值连接起来生成一个新的对象"ab",再让a指向它,但是原先的aString对象还是只想原来的对象“helloWord”
        a = a.concat(b);
        b=a;
    }

    public static void appengd(StringBuffer a,StringBuffer b){
        //StringBuffer是能够改变自身的值得,所以这会改变原有的值,而不是另外生成一个对象,
        //又由于a和aStringBuffer都指向了同一个对象,所以aStringBuffer的值也改变了
        a.append(b);
        //当前b指向了和a、aStringBuffer一样的对象,但是原本的bStringBuffer指向的对象并没有变化
        b = a;
    }
}

2、总结

String 和 StringBuffer 都是引用传递,形参和实参都是指向同一个对象。

但是由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象。所以形参怎么改变都不会影响到实参的值

而StringBuffer的值是可以改变的,形参的值改变也会影响实参的值。

转载于:https://my.oschina.net/liufukin/blog/2221786

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值