---Set:元素是无序(存入与取出的顺序不一定一致),元素不可以重复
---HashSet:底层数据结构是Hash表
---TreeSet:可以对Set集合中的元素排序,因为每插入元素就会排序,效率不高,底层是二叉树
方法一:保证元素唯一性的依据是compareTo方法return 0
方法二:比较器中实现compara方法
两种方法并存时,以比较器中的方法为准
Set集合的功能与Collection一致
HastSet
HashSet不能存在重复元素
--添加时首先是比较HashCode值
假若相同就比较元素是否相同,调用equals方法
假若不同,则不进行判断
---调用contains方法以及remove方法,依旧会先判断HashCode后,相同后判断equals方法
注:假若hashCode方法写错,就有可能存在相同的元素,
元素中重写hashCode方法以及equals方法
元素中的字符串也有本身的hashCode方法,重写时
pubic int hashCode()
{
System.out.println Strings.hashCode()+37;
}
public boolean equals(Obj ob)--此处必须是Obj复写
{
if(!(obj instanceof A)) --比较时先判断是否是相同的类
return fasle;
A a=(A)obj---必须强转,因为传进来的是Obj
return this.name.equals(a.name) && this.age == a.age---此处equals调用的是String类写好的方法,因为一般定义为String name =xx
}
TreeSet
让元素自身具备比较性,元素的自然顺序,默认顺序
需要比较,元素需继承Comparable接口,重写compareTo方法,返回值为 int类型,正数为大,0相等,负数为小,调用方法的对象与已存在对象进行比较
TreeSet本质是二叉树,取出时从小到大
class Student implements Comparable{
public String name;
public int age;
public int compareTo(Obj ob)
{
If(!(ob instanceof A))
throw new RuntimeException;
Studennt st =(Student) ob
if(this.age>st.age)
return 1;
if(this.age=st.age){
return this.name.compareTo(st.name);}
return -1;
}
}
注:String类 已实现compateTo方法
元素不具备比较性,或者具备的比较性不是所需要的,让集合自身具备比较性
比较器实现,定义一个类,继承Comparator接口,需要覆盖compara方法,New对象时,需要将比较器对象放入,如下
TreeSet ts =new TreeSet(new Mycompare())
比较器
class Mycompare implements Comparator
{
public int compare(obj o1,obj o2){
Student s1=(Student) o1;
Student s2=(Student) o2;
int num=s1.getname().compareTo(s2.getname())
if(num == 0){
return new Integer(s1.getage()).compareTo (new Integer(s2.getage()));
}
return num;
}
}