Set集合
Set是Collection的子接口,元素不可重复,它的实现类有HashSet、TreeSet、LinkedHashSet
1、HashSet其实是给HashMap包了一层壳,很多方法都是调用的hashMap的,比如add方法其实是将数据存入hashMap的key中,而value是一个空对象
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
2、TreeSet是通过TreeMap实现的,底层是二叉树结构,保证了元素的大小顺序
3、LinkedHashSet是HashSet的子类,很多方法实际上也都是直接用父类的方法,底层是哈希表和双向链表,他可以保证元素的添加顺序,因为在插入元素的时候不仅会存入元素,还有next指针
set是如何保证元素不可重复的?
HashSet和LinkedHashSet:
-
先比较hash值,如果hash值不一样,说明一定不相同,
-
如果hash值一样,再调用equals方法比较
TreeSet:调用compareTo(Object obj)方法判断元素的大小来进行升序排序,注意这里只包含基本数据类型,比如String,integer等实现了compareTo方法的类。如果泛型是实体类,就需要在实体类中实现Comparator接口的compare方法
综合来看,Set的实现类基本都是通过Map类实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,LinkedHashSet是通过LinkedHashMap来实现的)