Set

Set集合

Set集合:不保证存储顺序,不能重复,和Collection的方法相同
| 取出元素的方法只有一个:迭代器
|-HashSet:哈希表结构(不同步的)
|-TreeSet:二叉树结构(不同步的)可以对元素进行排序

HashSet:

哈希表在判断元素是否相同,依据hashCode方法。如果哈希冲突,就在判断元素的equals方法。
练习:Set set = new HashSet();
set.add(new Student(“wang”,18);
set.add(new Strdent(“wang”,18);
结果:都存进去了。why?
原因是每一次存储学生对象,都先调用hashCode方法获取哈希值。
但是调用的是Object类中的hashCode,所以new不同的对象,哈希值就不同。
所以解决的方法就是:覆盖hashCode方法和equals方法。
例:public int hashCode()
{
return **;
}
覆盖hashCode方法是为了根据元素自身特点确定哈希值。
*覆盖equals方法,是为了解决哈希值的冲突。

TreeSet:

比较方法的返回值是0就不保存(唯一性)
根据比较来构建一个二叉树保存数据,最后进行二叉树的遍历输出。(顺序)

public int compateTo(Object o)
{
    Student stu = (Student)o;
    int temp = this.age - stu.age;
    return temp == 0 ? this.name.compareTo(stu.name) :temp;
 }


如果元素具备的功能不是所需要的,也就是说不想按照自然排序的方法,而是按照
自定义的排序方式,对元素进行排序。
而且,存储到TreeSet中的元素万一没有比较功能,该如果排序呢?
这是,就只能使用第二种比较方式
                          --让集合具备比较功能


*实现Comparator接口,覆盖compare方法,将Comparator接口的对象,
作为参数传递给TreeSet集合的构造函数。

比较器更为灵活,自然排序通常作为元素的默认排序。