Java hashmap还是hashset?

Java hashmap还是hashset?,java,hashmap,hashset,Java,Hashmap,Hashset,我有两份清单 List<MyObj>. 列表。 MyObj有一个“stringid”成员 我需要不时地对它们进行迭代,有时我需要找到两者相似的对象。 我想要一个比列表更快的方法。这样我就可以知道我可以使用hashMap (比较时,ask包含(字符串)以外的内容) 我应该使用hashmap还是hashset 注意:在hashset中-我需要实现我的equals,当我运行contains()时-我认为它将比hashmap慢,在插入时,我将字符串id放入键中。 我说的对吗?使用H

我有两份清单

List<MyObj>.   
列表。
MyObj有一个“stringid”成员

我需要不时地对它们进行迭代,有时我需要找到两者相似的对象。
我想要一个比列表更快的方法。这样我就可以知道我可以使用hashMap (比较时,ask包含(字符串)以外的内容)

我应该使用hashmap还是hashset

注意:在hashset中-我需要实现我的equals,当我运行contains()时-我认为它将比hashmap慢,在插入时,我将字符串id放入键中。
我说的对吗?

使用HashMap,您将被迫以以下方式存储数据:

<ID1><MyObject> 
<ID2><MyObject>

这不是最好的方法,因为MyObject中已经有ID字段

使用HashSet,您将只能存储MyObject的唯一实例,并且还需要在MyObject中实现hashCode()

这取决于你的选择

注意:在hashset中-我需要实现我的equals,当我运行contains()时-我认为它将比hashmap慢,在插入时,我将字符串id放入键中。我说得对吗

我认为您不会注意到任何性能差异
HashSet
是在引擎盖下使用
HashMap
实现的。因此,唯一的区别是调用
MyObj.equals()
(它应该调用
String.equals()
)与直接调用
String.equals()
)。JIT编译器非常擅长内联调用


底线是,你不应该(几乎)担心微观优化,而应该专注于使你的设计简单一致。如果您唯一关心的是避免重复和检查包含,那么
集是一个更符合逻辑的选择。

这根本没有什么区别,因为当您查看JDK源代码时,
HashSet
的Sun实现在内部使用
HashMap
的实例来存储其值:

   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;

    // Dummy value to associate with an Object in the backing Map
......
公共类哈希集
扩展抽象集
实现Set、Cloneable、java.io.Serializable
{
静态最终长serialVersionUID=-502474406713321676L;
私有瞬态HashMap;
//要与背景贴图中的对象关联的虚拟值
......

即使情况并非如此,所有其他关于它与性能POV之间的差异也不会真正产生影响的答案都适用。唯一真正的区别是,不使用
equals()
hashCode()
密钥类的实现您需要编写自己的密钥集来使用,但是如果
id
字段是唯一标识符,那么这些可以简单地委托给类的
id
字段。

听起来像Java->添加了“Java”标记。如果不是java,请相应地重新标记您的问题。我想知道询问contains(在hashset上)是否会计算所有的hashcode。当询问contains()时在hashmap上-已保存索引并更快地获取它。HashSet不会每次都计算项的哈希。我认为HashSet和hashmap之间的性能差异不明显。它们存储数据的方式不同。这并不是因为set使用键作为值。