TreeSet用法
TreeSet可以用于元素进行排序及保证元素唯一,可以用过对象实现Comparable接口,或者new TreeSet的时候传入自定义的比较方法,实现自定义的排序。
public class TreeSetTest {
public static void main(String[] args){
TreeSet treeSet=new TreeSet();
// treeSet.add("aa");
// treeSet.add("qqq");
// treeSet.add("pppp");
// treeSet.add("aa");
// System.out.println(treeSet);
//自定义对象比较
treeSet.add(new Person("张三",7));
treeSet.add(new Person("李四",888));
treeSet.add(new Person("王五",99));
treeSet.add(new Person("方六",7));
System.out.println(treeSet);
//输出 [Person{name='张三', age=7}, Person{name='方六', age=7}, Person{name='王五', age=99}, Person{name='李四', age=888}]
//compareTo比较的是字符的大小,char的值
System.out.println("张三".compareTo("李四"));
System.out.println("------------------------------");
//元素也可以通过传入比较的方法,实现自定义的比较
TreeSet treeSet2=new TreeSet(new CompareByLen());
treeSet2.add("aasss");
treeSet2.add("bb");
treeSet2.add("ppppp");
treeSet2.add("nnn");
System.out.println(treeSet2);
//输出: [bb, nnn, aasss, ppppp]
}
static class CompareByLen implements Comparator<String> {
@Override
public int compare(String s1, String s2) { //按照字符串的长度比较
int num = s1.length() - s2.length(); //长度为主要条件
return num == 0 ? s1.compareTo(s2) : num; //内容为次要条件
}
}
}
Person类如下
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(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(Person o) {
int num=this.age-o.age;//年龄是第一比较条件
return num==0?this.name.compareTo(o.name):num;//年龄相等,在比较名字
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
compareTo()是怎么进行比较的呢?可以比较中文吗?
中文也有自己的ascii码,也是可以比较的,看看源码,是通过比较第一个字符的ascii码大小,如果相等,再继续比较下去
image.png
hashSet用法
- hashSet基于HashMap实现,以HashSet的值作为HashMap的一个key,以一个Object常量作为hashMap的值。
- HashSet允许拥有一个为null的值,HashSet的值不可重复
- 在创建HashSet的时候,如果合适,最好指定其内部HashMap的capacity和loadFactory的值,
重写equals方法的时候必须匹配相应的hashCode()方法,因为如果不重写的话,会导致hash不一致,hashMap会把hash不一致的元素放在不同的位置,导致判断对象相等时取到的对象不一致,产生两个对象。
区别
1.TreeSet背后的结构是TreeMap,也就是红黑树,能够实现自动排序。通过equals和compareTo方法进行内容的比较。
2.HashSet背后是HashMap,key是无序的,只能做外部排序。既然是Hash,那么就要重写其对象的hashCode和equals方法。
1.HashSet可以接受null值,有且只有一个
2.TreeSet默认不可以接受null值,会直接抛出空指针异常
3.set里没有重复数据,TreeSet里连虚无都没有
网友评论