Я понимаю, что HashSet основан на реализации HashMap, но используется, когда вам нужен уникальный набор элементов. Итак, почему в следующем коде при помещении одних и тех же объектов в карту и задании мы имеем размер обеих коллекций равным 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;
 }
}