通篇说明:
System.out.println(object)是 java 语言用于获取对象的内存地址的方法。
案例一:
int a=0;
int b=0;
System.out.println(“*************案例1****************”);
System.out.println(“a=>”+System.identityHashCode(a));
System.out.println(“b=>”+System.identityHashCode(b));
b=123;
System.out.println(“2: a=>”+System.identityHashCode(a));
System.out.println(“2: b=>”+System.identityHashCode(b));
System.out.println(“a =”+a+” b=”+b);
现象:
*************案例1****************
a=>1513712028
b=>1513712028
2: a=>1513712028
2: b=>1908316405
a =0 b=123
**********************************
结论:java虚拟机在执行变量赋值时候,会自动去找以往已经声明的变量空间值,如果发现有和现有需要空间值一致时,会自动把第一个的变量的内存地址赋值给新的变量,这样减少内存使用空间,这就是“传址”赋值。
案例二:
int a=0;
int b=0;
System.out.println(“*************案例2****************”);
System.out.println(“a=>”+System.identityHashCode(a));
System.out.println(“b=>”+System.identityHashCode(b));
b=123;
System.out.println(“2: a=>”+System.identityHashCode(a));
System.out.println(“2: b=>”+System.identityHashCode(b));
System.out.println(“a =”+a+” b=”+b);
System.out.println(“**********************************”);
现象:
*************案例2****************
a=>1513712028
b=>1513712028
2: a=>1513712028
2: b=>1908316405
a =0 b=123
**********************************
结论:
java程序在为变量改变值,如果发现一个空间同时被两个变量使用时候,当其中一个变量值需要重新赋值时候,会自己申请一个新的内存空间来为这个变量保存值,从而不会造成另一个变量数据错误,这点又何其他 编程语言 (如golang)的“传址”赋值不一样。
案例三
System.out.println(“*************案例3****************”);
int[] ArrayA={111,111};
int[] ArrayB=ArrayA;
int[] ArrayC=new int[2];
System.arraycopy(ArrayA,0,ArrayC,0,ArrayA.length);
System.out.println(“1:ArrayA=>”+System.identityHashCode(ArrayA));
System.out.println(“2:ArrayB=>”+System.identityHashCode(ArrayB));
System.out.println(“2:ArrayC=>”+System.identityHashCode(ArrayC));
ArrayB[0]=222;
System.out.println(“2:ArrayA=>”+System.identityHashCode(ArrayA));
System.out.println(“2:ArrayB=>”+System.identityHashCode(ArrayB));
System.out.println(“ArrayA[0]=”+ArrayA[0]+” ArrayB[0]=”+ArrayB[0]+” Arrayc[0]=”+ArrayC[0]);
System.out.println(“*********************************”);
现象:
*************案例3****************
1:ArrayA=>1720435669
2:ArrayB=>1720435669
2:ArrayA=>1720435669
2:ArrayB=>1720435669
ArrayA[0]=222 ArrayB[0]=222
*********************************
结论:
java对于像数组和对象完全是按着标准的“传址”赋值的原则,其中一个变量改变了值,另一个也会随着变化,这就是 c++ 的指针赋值。在java要复制一个梳子不能用“=”,需要使用“System.arraycopy()”;
案例四
System.out.println(“*************案例4****************”);
int c=1;
Integer d=Integer.valueOf(“1”);
int e=Integer.valueOf(c);
System.out.println(“c=>”+System.identityHashCode(c));
System.out.println(“d=>”+System.identityHashCode(d));
System.out.println(“e=>”+System.identityHashCode(e));
System.out.print(“采用‘==’判断”);System.out.println(c==d);
System.out.print(“采用‘equals’判断”);System.out.println(d.equals(e));
int[] A={1};
int[] B=new int[1];System.arraycopy(A,0,B,0,1);
System.out.println(System.identityHashCode(A));
System.out.println(System.identityHashCode(B));
System.out.print(“采用‘=’判断”);System.out.println(A==B);
System.out.print(“采用‘equals’判断”);System.out.println(A.equals(B));
System.out.print(“采用Arrays.equals()判断”);System.out.println(Arrays.equals(A,B));
System.out.println(“*********************************”);
现象:
*************案例4****************
c=>846492085
d=>846492085
e=>846492085
采用‘==’判断true
采用‘equals’判断true
1096283470
152005629
采用‘=’判断 false
采用‘equals’判断false
采用Arrays.equals()判断true
*********************************
结论:在java中,“==”是根据内存地址来作为判断依据,所以不能用于判断两个对象,而object.equals()是用于类对象判断的,但是不能用于判断数组,因为数组包含了多个对象,所以只能使用Arrays.equals()来比较。