Set接口:
public interface IMySet<E> {
boolean add(E e);
boolean remove(E e);
boolean contains(Object o);
int size();
}
HashSet实现:
import java.util.HashMap;
/**
* HashSet底层的数据存取是通过HashMap实现的
* 换句话说,如果了解HashMap,那么HashSet就非常容易了
* HashSet大部分的方法都是直接调用HashMap的方法就可以实现的
*/
public class MyHashSet<E> implements IMySet<E>{
HashMap<E, Object> map;
static final Object PRECENT = new Object();
public MyHashSet() {
this.map = new HashMap<>();
}
public MyHashSet(int initialCapacity) {
this.map = new HashMap<>(initialCapacity);
}
public MyHashSet(int initialCapacity, float inithialLoadFactor){
this.map = new HashMap<>(initialCapacity, inithialLoadFactor);
}
/**
* 如果已经存在此e这个key
* 那么HashMap会返回非空的Object(PRECENT),add方法就会返回false
* 注意,在HashMap的put方法中如果key相同,那么旧value会被新value取代,
* 但原来的在HashMap中的key是不会有任何改变的,也就是说这符合HashSet不允许重复元素的要求
*/
@Override
public boolean add(E e) {
return map.put(e, PRECENT) == null;
}
@Override
public boolean remove(Object o) {
return map.remove(o) == PRECENT;
}
@Override
public boolean contains(Object o) {
return map.containsKey(o);
}
@Override
public int size() {
return map.size();
}
}