1.基本数据类型传递的是值,所以一方修改对另一方没有影响
public static void main(String[] args) {
int a=1;
int b=2;
a=b;
System.out.println(a);//2
System.out.println(b);//2 b的值传递给了a
b=3;
System.out.println(a);//2
System.out.println(b);//3 b值的修改对a没有影响
}
2.引用数据类型传递的是地址值,所以一方修改对另一个方有影响
public class Test3 {
public static void main(String[] args) {
Try try1 = new Try("1");
Try try2 = new Try("2");
System.out.println(try1==try2);//false
try1=try2;
System.out.println(try1==try2);//true try2的地址赋给了try1
System.out.println(try1.name);//2
System.out.println(try2.name);//2 此时name值是同一个
try2.name="3";
System.out.println(try1==try2);//true
System.out.println(try1.name);//3
System.out.println(try2.name);//3 改变try2的name值,会对try1的值产生影响
}
}
class Try {
String name;
public Try(String name) {
this.name = name;
}
}
3.十分特殊的String,String的特殊性来自于其创建方式的特殊性
3.1 String s1=“a”,这种创建方式,栈内存里面s1的名字,会指向常量池里的常量"a",而且"a"在常量池中只存一份
public static void main(String[] args) {
String s1="a";
String s2="a";
System.out.println(s1==s2);//true 他们的都指向了常量池里面的同一个"a"
}
3.2 String s1 =new String(“a”),这种创建方式,栈内存里面s1的名字,会先指向堆内存里的一个地址,然后该地址会指向常量池里的"a"
public static void main(String[] args) {
String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1==s2);//false 他们的地址不同
}
3.3 String的+运算,只有完全都是常量的+运算会在常量池中进行,其余的情况都是在堆内存中进行
public static void main(String[] args) {
String s1 = "a";
String s2 = "b";
String s3="ab";
String s4="a"+"b";
System.out.println(s3==s4);//true 都是常量在常量池中计算,s3和s4指向常量池中唯一的"ab"
String s5="a"+s2;
System.out.println(s3==s5);//false 此时计算是在堆内存中,s5先指向堆内存的一个地址,然后指向常量池中的"ab"
String s6=s1+s2;
System.out.println(s3==s6);//false 同s5
System.out.println(s5==s6);//false s5和s6在堆内存中有不同的地址
}