集合
Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素。
用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
特点
Java的Set接口继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两种实现。
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;
集合的接口定义
public interface CustomSet<E> {
boolean add(E e);
boolean remove(E e);
boolean contains(Object o);
int size();
}
基于HashSet的实现
jdk的源码中,HashSet底层的数据存取是通过HashMap实现的。了解HashMap之后,那么HashSet就非常容易。HashSet大部分的方法都是直接调用HashMap的方法就可以实现的。这种方法比较取巧,不过如何能手动实现HashSet,实现HashSet问题也不大。
CustomHashSet.java
public class CustomHashSet<E> implements CustomSet<E> {
private HashMap<E, Object> map;
static final Object PRECENT = new Object();
public CustomHashSet() {
this.map = new HashMap<>();
}
public CustomHashSet(int initialCapacity) {
this.map = new HashMap<>(initialCapacity);
}
public CustomHashSet(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();
}
}
(完)