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集合的构造函数。
比较器更为灵活,自然排序通常作为元素的默认排序。