Java容器之HashSet源码总结
Set接口和Collection接口方法基本一致,或者说Set是典型的集合。
Set接口
package gemme.collection;
import java.util.Iterator;
/**
* 自定义散列Set
* */
public interface IMySet<E> extends IMyCollection<E> {
// 集合内元素个数
int size();
// 迭代器
@Override
Iterator<E> iterator();
// 添加一个元素
boolean add(E e);
// 删除一个元素
boolean remove(Object o);
// 是否包含该元素
boolean contains(Object o);
// 是否相等
boolean equals(Object o);
// 返回散列的哈希值
int hashCode();
}
HashSet类
- HashSet依赖的底层数据结构是哈希表
- HashSet允许有NULL值
- HashSet实现的是Set接口,不允许重复
package gemme.collection;
/**
* 自定义抽象类AbstractSet
* */
public interface IMyAbstractSet<E> extends IMySet<E> {
}
HashSet高度依赖HashMap,它的内部有一个HashMap,方法都是在对HashMap实体进行操作
package gemme.collection;
import java.util.HashMap;
import java.util.Iterator;
/**
* 自定义散列HashSet
* */
public class MyHashSet<E> implements IMyAbstractSet<E> {
private HashMap<E, Object> map;
private static final Object PRESENT = new Object();
public MyHashSet() {
map = new HashMap<>();
}
@Override
public int size() {
return map.size();
}
@Override
public Iterator<E> iterator() {
return map.keySet().iterator();
}
@Override
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
@Override
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
@Override
public boolean contains(Object o) {
return map.containsKey(o);
}
}