[英]object reference set in java
我需要創建一組對象。 我擔心的是,我不想將哈希或等式基於對象的hashCode和equals實現。 相反,我希望哈希碼和相等性僅基於每個對象的引用標識(即:引用指針的值)。
我不確定如何在Java中執行此操作。
這背后的原因是我的對象無法可靠地實現equals或hashCode,在這種情況下,引用標識就足夠了。
我想您正在尋找java.util.IdentityHashMap
(請注意,沒有IdentityHashSet
)。 查找API文檔:
此類使用哈希表實現
Map
接口,在比較鍵(和值)時使用引用相等代替對象相等。 換句話說,在IdentityHashMap
,當且僅當(k1==k2)
,兩個鍵k1
和k2
被視為相等。 (在普通Map
實現中(如HashMap
),只有且僅當(k1==null ? k2==null : k1.equals(k2))
兩個鍵k1
和k2
才被視為相等。)此類不是通用的
Map
實現! 雖然此類實現Map
接口,但它有意違反Map
的常規協定,該協定要求在比較對象時使用equals
方法。 此類僅設計用於僅在需要引用相等語義的情況下使用。
編輯 :請參閱下面的Joachim Sauer的評論,基於特定Map
制作Set
真的很容易。 您需要執行以下操作:
Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());
您可以將對象包裝到包裝器類中,然后可以實現hashcode
並僅基於對象的標識進行equals
。
你可以擴展HashSet
(或實際- AbstractSet
),並帶回它IdentityHashMap
它采用System.identityHashCode(object)
,而不是obj.hashCode()
您可以簡單地用谷歌搜索IdentityHashSet
,已經有一些實現。 或按照Joachim Sauer的建議使用Collections.newSetFromMap(..)
。
當然,僅當您不屬於對象類的“擁有”時,才應該這樣做。 否則,只需修復其hashCode()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.