首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java HashSet vs HashMap

Java HashSet vs HashMap
EN

Stack Overflow用户
提问于 2011-04-17 04:48:42
回答 4查看 100.5K关注 0票数 54

我知道HashSet是基于HashMap实现的,但它是在需要一组独特的元素时使用的。那么,为什么在接下来的代码中,当我们将相同的对象放入map和set中时,两个集合的大小都等于1?贴图大小不应该是2吗?因为如果两个集合的大小相等,我看不出使用这两个集合有什么区别。

代码语言:javascript
复制
    Set testSet = new HashSet<SimpleObject>();
    Map testMap = new HashMap<Integer, SimpleObject>(); 

    SimpleObject simpleObject1 = new SimpleObject("Igor", 1);
    SimpleObject simplObject2 = new SimpleObject("Igor", 1);
    testSet.add(simpleObject1);
    testSet.add(simplObject2);


    Integer key = new Integer(10);

    testMap.put(key, simpleObject1);
    testMap.put(key, simplObject2);

    System.out.println(testSet.size());
    System.out.println(testMap.size());

输出是1和1。

代码语言:javascript
复制
SimpleObject code

public class SimpleObject {

private String dataField1;
private int dataField2;

public SimpleObject(){}

public SimpleObject(String data1, int data2){
    this.dataField1 = data1;
    this.dataField2 = data2;
}

public String getDataField1() {
    return dataField1;
}

public int getDataField2() {
    return dataField2;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((dataField1 == null) ? 0 : dataField1.hashCode());
    result = prime * result + dataField2;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    SimpleObject other = (SimpleObject) obj;
    if (dataField1 == null) {
        if (other.dataField1 != null)
            return false;
    } else if (!dataField1.equals(other.dataField1))
        return false;
    if (dataField2 != other.dataField2)
        return false;
    return true;
 }
}
EN

回答 4

Stack Overflow用户

发布于 2011-04-17 04:51:49

Map中的键只能映射到单个值。因此,当您第二次使用相同的键put到映射时,它会覆盖第一个条目。

票数 7
EN

Stack Overflow用户

发布于 2011-04-17 04:59:34

在使用HashSet的情况下,添加same对象或多或少是没有意义的。在HashMap的情况下,将新的键、值对与现有的键进行配对将覆盖现有的值,从而为该键设置新值。下面我给你的代码添加了equals()检查:

代码语言:javascript
复制
SimpleObject simpleObject1 = new SimpleObject("Igor", 1);
SimpleObject simplObject2 = new SimpleObject("Igor", 1);
//If the below prints true, the 2nd add will not add anything
System.out.println("Are the objects equal? " , (simpleObject1.equals(simpleObject2));
testSet.add(simpleObject1);
testSet.add(simplObject2);


Integer key = new Integer(10);
//This is a no-brainer as you've the exact same key, but lets keep it consistent
//If this returns true, the 2nd put will overwrite the 1st key-value pair.
testMap.put(key, simpleObject1);
testMap.put(key, simplObject2);
System.out.println("Are the keys equal? ", (key.equals(key));
System.out.println(testSet.size());
System.out.println(testMap.size());
票数 6
EN

Stack Overflow用户

发布于 2014-10-13 08:48:35

我认为主要的区别是,HashSet在某种意义上是稳定的,它不会替换重复的值(如果在插入第一个唯一键之后发现,只需丢弃所有未来的重复项),并且HashMap将努力用新的重复值替换旧的。所以在HashMap中一定会有插入新重复项的开销。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5689517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档