美文网首页Java
TreeSet和HashSet的区别

TreeSet和HashSet的区别

作者: ffxxbb5 | 来源:发表于2019-06-08 01:02 被阅读0次

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里连虚无都没有

相关文章

网友评论

    本文标题:TreeSet和HashSet的区别

    本文链接:https://www.haomeiwen.com/subject/buebxctx.html