Это на самом деле ничего не меняет, потому что когда вы смотрите на исходный код 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
......
И даже если это не так, то все остальные ответы о том, что это на самом деле не имеет никакого значения, относятся к POV производительности.Единственное реальное отличие состоит в том, что вместо использования equals()
и hashCode()
реализаций вашего ключевого класса вам нужно написать свою собственную для использования Set - но это может быть так же просто, как делегирование в поле id
вашего класса., в случае, если поле id
является уникальным идентификатором.