Set集合有两种 一种是HashSet 一种是TreeSet
底层数据结构分别是 hash表 和 二叉树 所以只要见到Hash打头的 都是hash表结构的 看到Tree打头的都是二叉树 结构的
下面是hash结构 和 二叉树 结构 怎么排序的情况~~~!
HashSet是通过当add添加元素的时候 系统自动调用hashCode()方法判断hash值
如果相等则不会被添加,如果相等,再通过hashCode方法调用equals方法判断。
一般添加的时候都会在类中重写hashCode 和equals以满足实际条件的需求。
但是,ArrayList和HashSet重写Object类中的equals方法原理都是一样的。
例如:
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
此equals是重写Object中的equals方法
obj形参 实参是contains中的,相当于obj=new Person("xiaoxiao11",15); 多态
public boolean equals(Object obj)
{
判断传进来的对象是否是Person对象 不是的话就返回false
if (!(obj instanceof Person))
{
return false;
}
因为穿参传进来的对象是Object的子类对象,体现多态性,必须向下转型
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
而return中的equlas是字符串中的equals方法~~! 比较字符串对象的内容是否相同
}
}
关于TreeSet添加自定意对象,让其排序的问题。有两种方式
第一种 让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖
compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
当在TreSet中添加对象的时候底层自动调用Comparable接口中的compareTo方法
class Student implements Comparable <Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Student s)
{
System.out.println(this.name+"...compareto...."+s.name);
int num= new Integer(this.age).compareTo(new Integer (s.age));
if(num==0)
return this.name.compareTo(s.name);//比较名字是否相同时次要条件
return num;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
第二种: 当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让
集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,
即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。
比较器--定义一个类,实现Comparator接口,覆盖compare方法。
而当两种排序都存在时以比较器为主
使用了泛型--在集合初始化时把new Mycomparator()以构造方法传参传进去即可
class Mycomparator implements Comparator<String>
{
public int compare(String o1,String o2)
{
int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));
if (num==0)
{
return o1.compareTo(o2);
}
return num;
}
}
|