问题引入
大家都知道值传递和引用传递,下面我来通过以一个问题和示例来解决引用类型传递的原理
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类型有特定的字符串池,每次改变字符串的值就会向常量池中添加新的字符串,如下如图所示:
以上是我这篇博客的内容如有不正确的地方希望大家指出!!!