通篇說明:
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()來比較。
閱讀更多 代碼桃子 的文章