1、在Java中基本数据的传递是通过值传递进行的。
2、引用数据类型的传递是通过地址传递进行的。
public class Relative {
public static void main(String[] args) {
int a = 5;
int b = 5;
double c = 10;
double d = 10;
Integer e = 100;
Integer f = 100;
Integer ee = 200;
Integer ff = 200;
Integer h = e + f;
String aa = "abc";
String bb = "a" + "bc";
String cc = "a";
String dd = "bc";
String m = cc + dd;
String n = new String("abc");
System.out.println("a == b " + (a == b)); // a == b true
System.out.println("c == d " + (c == d)); //c == d true
System.out.println("e == f " + (e == f)); // e == f true
System.out.println("ee == ff " + (ee == ff)); // ee == ff false
System.out.println("h == ee " + (h == ee)); // h == ee false
System.out.println("aa == bb " + (aa == bb));// aa == bb true
System.out.println("aa == m " + (aa == m)); // aa == m false
System.out.println("m == n " + (m == n)); //m == n false
System.out.println("aa == n " + (aa == n)); // aa == n false
}
}
总结:
我们发现a,b,c,d,e,f,ee,ff,h都是基本数据类型,他们的传递方式应该是值传递,那么a==b,c==d,e==f,ee==ff,h==ee,都应该是true,但是通过以上代码的测试我们发现ee==ff,h==ee都是false,那是因为Interger类型的传递要经过一个valueOf方法来判断是否需要创建一个新的地址去存储这些变量
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}因为200大于127了所以Inter在传递ee,ff和h的时候要先进行装箱操作,需要给他们分配一个新的地址,所以他们的传递是通过地址进行传递的,所以为false。
aa,bb,m和n都是字符串他们进行传递的时候都是通过地址进行传递的aa==bb是true是因为编译器在进行编译的是把"a" + "bc"直接合并成了"abc",所以aa和bb的值是一样的所以bb分配地址的时候就会去引用aa的地址。
m==aa为false是因为cc + dd是一个运算编译器并不会进行运算,程序在运行的时候是先给m创建了一个地址然后才把cc + dd的结果赋给了m,系统在给m分配地址的时候并不知道m内的值和aa一样,所以m不会引用aa的地址。n也是在程序运行的时候先给他分配了一个地址然后才会执行把"abc"赋给n的程序所以n的地址和m以及aa的都不一样。