Bootstrap

引用传递示例,以及String类型如何传递的原理

问题引入

大家都知道值传递和引用传递,下面我来通过以一个问题和示例来解决引用类型传递的原理

        1)先创建了引用类型Person里面有String name 和int age 

        2)new 一个对象,把这个对象的值赋给a,再把a赋给Person类型的b

 

package classtest1224;

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

主函数

 Person a = new Person();
        a.setAge(18);
        a.setName("zzt");
        Person b = a;
        System.out.println("--------------");
        System.out.println(a);
        System.out.println(b);
        System.out.println("--------------");
        System.out.println("接下来改变a的Name看看b的值能不能改变");
        b.setName("慢慢学");
        System.out.println(a);
        System.out.println(b);

思考:将a的值赋值给了b,通过改变b的值能改变a的值吗?

你的结果是这样吗?

        Person{name='zzt', age=18}
        Person{name='慢慢学', age=18}

测试结果如下

        Person{name='慢慢学', age=18}
        Person{name='慢慢学', age=18}

是不是挺奇怪的,这就是引用传递具体

可以见下面这张图 

提出问题

所以所有引用类型的值是不是都是这也传递的呢?经过我的学习,除了String类剩下的都是可以的下来就看看String类到底是怎么样的

1.String的字符串池问题

        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2);

比较结果会是怎么样的?true?false?

是内容一样但是地址不一样,所以结果是false吗?

测试结果:true 

 

 

 

我先看了String源码发现底层是final的字符数组,意思就是她的值是不可改变的,那为什么字符串可以进行a+="abc";操作呢?

 

原因是:每次修改String类型的值都会重新创建一个出来,所以对字符串的操作是非常浪费资源的。但因为java的垃圾回收机制,长时间不用的又会被回收掉!

不多废话了!直接上代码!!!

        String c = "abc";
        String d = c;
        System.out.println("改变c看看d的值是否改变");
        c+="d";
        System.out.println(d);

测试结果如下 

 通过改变c的值发现d的值并没有改变

原理是:String类型有特定的字符串池,每次改变字符串的值就会向常量池中添加新的字符串,如下如图所示: 

 以上是我这篇博客的内容如有不正确的地方希望大家指出!!!

 

 

;