美文网首页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