關於java 變量“指針”實驗報告

通篇說明:

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()來比較。


分享到:


相關文章: