如何在 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 中查找并返回对象的主要内容,如果未能解决你的问题,请参考以下文章