簡體   English   中英

在Java中設置的對象引用

[英]object reference set in java

我需要創建一組對象。 我擔心的是,我不想將哈希或等式基於對象的hashCode和equals實現。 相反,我希望哈希碼和相等性僅基於每個對象的引用標識(即:引用指針的值)。

我不確定如何在Java中執行此操作。

這背后的原因是我的對象無法可靠地實現equals或hashCode,在這種情況下,引用標識就足夠了。

我想您正在尋找java.util.IdentityHashMap (請注意,沒有IdentityHashSet )。 查找API文檔:

此類使用哈希表實現Map接口,在比較鍵(和值)時使用引用相等代替對象相等。 換句話說,在IdentityHashMap ,當且僅當(k1==k2) ,兩個鍵k1k2被視為相等。 (在普通Map實現中(如HashMap ),只有且僅當(k1==null ? k2==null : k1.equals(k2))兩個鍵k1k2才被視為相等。)

此類不是通用的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM