Java是一種基于對象的編程語言,在Java中,數(shù)據(jù)的存儲方式有兩種:棧和堆。棧是一種后進先出(LIFO)結構,用于存儲基本數(shù)據(jù)類型和對象引用的地址,棧的大小是有限的,所以一般存儲的數(shù)據(jù)較小。堆是存儲在內存中大段的數(shù)據(jù),用來存儲對象實例,堆的大小比棧要大得多,可以存儲較大的對象。
public class Person { String name; int age; } Person person = new Person(); person.name = "Jack"; person.age = 20;
在上面的代碼中,我們定義了一個Person類,并創(chuàng)建了一個Person對象。當我們創(chuàng)建對象時,JVM會在堆上分配空間來保存Person對象的實例,然后在棧上分配一個引用來指向這個對象實例。通過這個引用,我們可以訪問Person對象的成員變量和方法。
Person person1 = new Person(); Person person2 = person1;
在上面的代碼中,我們創(chuàng)建了兩個Person對象,person1和person2。當我們將person1的引用賦值給person2時,實際上是將對象的地址復制給了person2,這意味著person1和person2都指向同一個Person對象。這是因為在Java中,對象變量只是保存了對象地址的變量,而不是實際對象本身。
當不再有任何引用指向一個對象時,該對象就可以被垃圾回收器回收。由于這個原因,我們不能控制對象在內存中的位置,也不能直接訪問對象在內存中的地址。但是我們可以使用System.identityHashCode方法獲取對象的哈希碼,這個哈希碼可以唯一地標識對象。
System.out.println(System.identityHashCode(person1)); System.out.println(System.identityHashCode(person2));
在上面的代碼中,我們分別輸出了person1和person2的哈希碼。由于person1和person2指向同一個對象,它們的哈希碼相同。