1 HashSet
1.1 基本特性
HashSet利用hashcode进行查询,可以在 O ( 1 ) O(1) O(1)时间内完成查询。同时其中元素并没有顺序,其中的元素不可以重复。
通过hashCode和equals方法来保证元素的唯一性。根据存储的元素计算出hashCode值,然后根据计算得出的hashCode值和数组的长度进行计算出存储的下标;如果下标的位置无元素,那么直接存储;如果有元素,那么使用要存入的元素和该元素进行equals方法,如果结果为真,则已经有相同的元素了,所以直接不存;如果结果假,那么进行存储,以链表的形式存储。
所以在向HashSet集合中存储自定义对象时,为了保证set集合的唯一性,那么必须重写hashCode和equals方法。
1.2 Constructor
HashSet可以用Collection object创建。Collection是一个顶级接口,继承它的类有两大类:List和Set。具体细节可以参考下面的文章Collection详解
Ex:
List<String> list = new LinkedList<>();
list.add("jfbhj");
list.add("nvcu");
HashSet<String> strSet = new HashSet<>(list);
1.3 Methods
add(E e): 向set中插入一个元素,如果这个元素之前不存在,直接插入,return false;如果这个元素之前存在,不进行任何操作直接return true
remove(Object o): 从set中删除一个元素,如果这个元素存在,直接删除,return true;如果这个元素不存在,不进行任何操作直接return false
iterator(): 返回一个iterator用来遍历set中的元素,用foreach也可以遍历元素
HashSet<Integer> set = new HashSet<>();
set.add(3);
set.add(5);
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
for (Integer tmp : set) {
System.out.println(tmp);
}
2 LinkedHashSet
和HashSet基本一致,区别在于LinkedHashSet是存取有序的,遍历元素取出来的顺序和插入的顺序是相同的。
向LinkedHashSet集合中存储自定义对象时,为了保证set集合的唯一性,那么必须重写hashCode和equals方法。
2.1 Constructor
2.2 Methods
3 TreeSet
存取无序,元素唯一,元素添加进去时,自动进行排序。
TreeSet是基于Binary Tree的数据结构,
3.1 constructor
3.2 methods
TreeSet保证元素的唯一性有两种方式:
1、自定义对象实现Comparable接口,重写comparaTo方法,该方法返回0表示相等,小于0表示准备存入的元素比被比较的元素小,否则大于0;
2、在创建TreeSet的时候向构造器中传入比较器Comparator接口实现类对象,实现Comparator接口重写compara方法。
如果向TreeSet存入自定义对象时,自定义类没有实现Comparable接口,或者没有传入Comparator比较器时,会出现ClassCastException异常
4 总结
这三种 set都属于 顶级接口Collection下面的Set,与set并列的是List