容器(十):Collection三足鼎立之Set
标签: Java编程思想
Set接口简介
public interface Set<E> extends Collection<E>
Set是Collection家族中的一份子,它的概念类似于数学中的“集合”,它与List的区别就是:Set不包含重复元素的集合。
当对Set中添加相同的元素的时候,后面的这个不能添加进去。
那么这里就要进行一个说明:如何判断“相同元素”?
我们可以这样说:Set中不包含一对元素e1和e2 ,使得e1.equals(e2)
,并且最多一个空元素。当向Set中添加相同的元素的时候,后面的这个不能添加进去。这就要求我们,对于自定义的类型,一定要重写写equals()方法和hashCode()方法
这是因为:Set中的元素通过判断哈希值来存储,首先调用此对象所在类的hashCode方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前的没有对象存储,则这个对象直接存到此位置。若此位置已有对象存储,再通过equals()比较这两个对象是否相同,如果相同,后一个对象就不能再添加进来。
Set源码分析
其实我们可以看到Set作为一个接口,没有方法的具体实现,而且大部分方法都是继承自Collection的
package java.util;
public interface Set<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean retainAll(Collection<?> c);
boolean removeAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
}
总结
- Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
- AbstractSet 是一个抽象类,它继承于AbstractCollection,AbstractCollection实现了Set中的绝大部分函数,为Set的实现类提供了便利。
- HashSet 和 TreeSet 是Set的两个实现类。其中HashSet是主实现类
- HashSet是依赖于HashMap,它实际上是通过HashMap实现的。HashSet中的元素是无序的。
- TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。TreeSet中的元素是有序的。
ps:用心学习,喜欢的话请点赞 (在左侧哦)