[英]Java references values are addresses values?
當我做:
int x[] = new int[2];
System.out.println("...> " + x);
輸出值如下: [I@1b67f74
以便十六進制數與已分配對象的內存地址有關?
[I
意思是什么?
不,該十六進制數不應被解釋為對象所在的內存地址。 實際上,它是對象的哈希碼。 Object.toString()
的API文檔說:
類Object的toString方法返回一個字符串,該字符串由對象為實例的類的名稱,符號字符“@”以及對象的哈希碼的無符號十六進制表示組成。 換句話說,此方法返回一個等於值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
java.lang.Object.hashCode()
的API文檔說:
盡可能合理,Object類定義的hashCode方法確實為不同的對象返回不同的整數。 (這通常通過將對象的內部地址轉換為整數來實現,但JavaTM編程語言不需要此實現技術。)
因此,對於Sun的JVM,如果不覆蓋hashCode()
方法,那么它確實是對象的內存地址,但不能保證這樣,所以你不應該依賴它。
沒有(真實的,可靠的)方式(適用於任何JVM)以獲得純Java中對象的內存地址; Java沒有指針,引用與指針不完全相同。
Java虛擬機規范的4.3.2節解釋了[I
意思; 在這種情況下,它意味着您的變量是一個int
數組。
來自: Java:“[B @ 1ef9157”背后的語法和含義? 二進制/地址?
十六進制數字是對象ID或哈希碼。
[I
意思是它是一個數組( [
]的整數( I
)。
[我代表一個int數組的類名。 vm中的地址編號,但由於hashCode通常被覆蓋,因此直接使用它來識別對象並不明智。 為此,使用System.identityHashcode(Object x),它以可靠的方式返回相同的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.