我知道HashSet
是基于HashMap
实现的,但它是在需要一组独特的元素时使用的。那么,为什么在接下来的代码中,当我们将相同的对象放入map和set中时,两个集合的大小都等于1?贴图大小不应该是2吗?因为如果两个集合的大小相等,我看不出使用这两个集合有什么区别。
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。
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;
}
}
发布于 2011-04-17 04:51:49
Map
中的键只能映射到单个值。因此,当您第二次使用相同的键put
到映射时,它会覆盖第一个条目。
发布于 2011-04-17 04:59:34
在使用HashSet的情况下,添加same对象或多或少是没有意义的。在HashMap的情况下,将新的键、值对与现有的键进行配对将覆盖现有的值,从而为该键设置新值。下面我给你的代码添加了equals()检查:
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());
发布于 2014-10-13 08:48:35
我认为主要的区别是,HashSet在某种意义上是稳定的,它不会替换重复的值(如果在插入第一个唯一键之后发现,只需丢弃所有未来的重复项),并且HashMap将努力用新的重复值替换旧的。所以在HashMap中一定会有插入新重复项的开销。
https://stackoverflow.com/questions/5689517
复制相似问题