如何在 java hashset 中查找并返回对象

Posted

技术标签:

【中文标题】如何在 java hashset 中查找并返回对象【英文标题】:how to find and return objects in java hashset 【发布时间】:2011-01-19 05:16:10 【问题描述】:

根据 HashSet javadoc,HashSet.contains 只返回一个布尔值。如何在 hashSet 中“找到”一个对象并对其进行修改(它不是原始数据类型)?

我看到 HashTable 有一个 get() 方法,但我更喜欢使用集合。

【问题讨论】:

谢谢大家!我的对象实际上包含一个我需要经常更新的链表,所以我认为我将只使用 HashTable 而不是为每个对象更新进行昂贵的迭代。 【参考方案1】:

引用股票Sun java.util.HashSet的来源:

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

所以你是在为一张地图付费,你不妨使用它。

【讨论】:

我想你是想说“使用 HashMap”……对吗? :-) 是的。抱歉,有时我无法抗拒从答案中拼出小谜题的冲动。【参考方案2】:

您可以删除一个元素并添加一个不同的元素。

在哈希集中修改对象是灾难的根源(如果修改改变了哈希值或相等行为)。

【讨论】:

这并不完全正确。如果更改不影响对象的相等性(和哈希码),则修改 HashSet 元素是安全的。例如,如果 equals 和 hashCode 没有被覆盖,那么改变是安全的,因为它的相等性没有改变。 是的,这就是我在括号中写这部分的原因。【参考方案3】:

您可以遍历集合以找到您的对象。

来自API doc 的警告:

"注意:如果将可变对象用作集合元素,则必须非常小心。如果对象的值以影响相等比较的方式更改,则不指定集合的​​行为,而对象是集合中的一个元素。”

【讨论】:

"你可以迭代..." 但是当然,如​​果你这样做,更新一个集合元素就变成了O(N) 操作。【参考方案4】:
Object oldobj; //object to modify
if (hashset.remove(oldobj)) 
   Object newobj; //modified object
   hashset.add(newobj);

【讨论】:

【参考方案5】:

类似:

MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);

if (hashSet.contains(obj) == true) 
    hashSet.remove(obj);
    obj.setSomething();
    hashSet.add(obj);

【讨论】:

1. == true - 没有必要 2. 你没有检查.remove(obj) 的返回值 3. 如果你在下一步删除.contains() 是不必要的 尽管一切都是真的,你也不应该这么挑剔:)【参考方案6】:

我遇到了同样的问题,想出了下面的解决方案(应该实现了Set接口,但不是所有的方法都在这里)

public class MySet<T> implements Set<T>

    private HashMap<T,T> items = new HashMap<T,T>();


    public boolean contains(Object item) 
    
        return items.containsKey(item);
    

    public boolean add(T item) 
    
        if (items.containsKey(item))
            return false;
        else
        
            items.put(item, item);
            return true;
        
    

    public T get(T item) 
    
        return items.get(item);
    

【讨论】:

无需委托。只需使用 HashMap 而不是 HashSet。

以上是关于如何在 java hashset 中查找并返回对象的主要内容,如果未能解决你的问题,请参考以下文章

java中hashset和hashmap 有啥特点。

将我的对象返回到HashSet

java容器

Java容器

类HashSet

Java 之 HashSet 集合