set中的hashset和treeset,区别:
相同点:
1元素值不能重复
2.hashset和treeset都不能为null
不同点:
1.hashset是无序的,treeset是有序的
2.treeset可以按照字典顺序排列,也可以自定义排序
3.hashset的底层是hashmap,是通过hashcode值和equals来保证元素的唯一性的,而hashmap是通过compareto方法来保证的
注:对于hashset来说,只有hashcode和equal值相等,两个对象才相等,存储时,当两个对象的hashcode不同,可以直接存储,hashcode值相同时,equals为true,就认为这两个对象相等,当equals为false时,就认为这两个对象不相等,这两个对象的存储相当于桶(个人理解为十字链表)
TreeSet的用法
默认的是字典的排序方法
对于引用类型,可以有两种方法自定义排序
1.在当前类中实现comparable接口,重写compareTo方法
2.重写一个类实现comparator接口,重写compare方法
对于基本数据类型,例如int类型,需要转换成包装器类型,其余与引用类型相同
两种方法取决于构造方法的不同
这是一个基本的Demo,虽然看见的是int类型的,但是内部转换成为了Integer类型
public class Demo01 {
public static void main(String[] args) {
//Set中存放的数据必须是同一类型
Set s=new TreeSet();
s.add(1);
s.add(10);
s.add(12);
s.add(9);
s.add(5);
Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
对于基本数据类型,自定义类实现comparator接口,重写compare方法
public class MySort implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Integer a = (Integer) o1;
Integer b = (Integer) o2;
return -1 * (a.compareTo(b));
}
}
public class test1 {
public static void main(String[] args) {
Set<Integer> s=new TreeSet(new MySort());
s.add(2);
s.add(10);
s.add(12);
s.add(9);
s.add(15);
Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
对于引用类型的,第一种方法
public class Students implements java.lang.Comparable {
private String name;
private int age;
public Students(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Object o) {
Students stu = (Students) o;
if (this.getAge() >stu.getAge()) {
return 1;
}
if (this.getAge() == stu.getAge()) {
return 0;
}
return -1;
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class test2 {
public static void main(String[] args) {
Set s=new TreeSet();
Students s1=new Students("xiaowang",23);
Students s2=new Students("dawang",56);
Students s3=new Students("shenma",21);
s.add(s1);
s.add(s2);
s.add(s3);
Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
引用类型的第二种方法
public class Students2 {
private String name;
private int age;
public Students2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MySort2 implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Students2 s1 = (Students2) o1;
Students2 s2 = (Students2) o2;
int num=s1.getAge()>s2.getAge()?1:(s1.getAge()==s2.getAge()?0:-1);
return -1*num;
}
}
public class test3 {
public static void main(String[] args) {
Set s=new TreeSet(new MySort2());
Students2 s1=new Students2("xiaowang",23);
Students2 s2=new Students2("dawang",56);
Students2 s3=new Students2("shenma",21);
s.add(s1);
s.add(s2);
s.add(s3);
Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
注意compare的判断,只能用于基本数据类型的包装器类型