2013-12-17 47 views
7

我需要檢查返回的列表是否曾經創建過,或者它是否是對象的副本。有可能找出它的地址嗎?如何獲取列表的地址?

// thread 1 
List<Object> list = supplier.get(); 
System.out.print("list: " + list + "@" + getAddress(list)); 

// thread 2 
List<Object> list = supplier.get(); 
System.out.print("list: " + list + "@" + getAddress(list)); 

getAddress(list)怎麼樣?問題是hashCode()通常返回的地址在AbstractList中被覆蓋,所以它會返回一個有效的哈希碼而不是地址。

+0

我會問「什麼地址?」,但後來我將它搞清楚了。有趣的問題,但。 – GGrec

回答

6

是否可以找出它的地址?

號可以,但是,檢查參考平等 - 這是所有你關心:

if (list1 == list2) 
{ 
    // They're the same 
} 

如果你真的想從採伐做到這一點,你可以用System.identityHashCode代替,但要意識到這是而不是意味着被視爲地址。它仍然是一個哈希碼,並不保證是唯一的。它可能是相關的到一些內部地址,但這還遠遠沒有保證。

8

我猜你想

System.identityHashCode(list); 

的Javadoc說

返回相同的散列碼爲給定的對象會被默認的方法的hashCode(返回),無論是否在給定對象的類重寫hashCode()。

+0

哇!謝謝,這就是我需要的。儘管我會接受喬恩的答案,因爲它更精確。 –

2

對象的地址在Java中不固定,它可以移動,所以你不能得到它。

你爲什麼不簡單地檢查if(list1 == list2)

+0

Downvoter請讓我知道我說錯了什麼。 – Maroun

+1

現在我明白了--JVM可以移動對象,因此它的物理地址將會改變。 +1 –