简单的理解java集合中的HashSet和HashTree几个重写方法
Java中的set是无序的,但是是不可重复的
HashSet底层是哈希表,通过调用hashcode和equals方法实现去重
当我们HashSet里面存的是字符串时,就能默认去重了,因为String已经重写了hashcode和euqals方法
publicstaticvoidmain(String[]args){ HashSetset=newHashSet(); set.add("java"); set.add("c"); set.add("php"); set.add("bigdata"); set.add("java"); //运行结果,给去重了,而且是无序的 System.out.println(set);//[java,c,bigdata,php] } }
但是当我们有类的时候,比如Person,Cat,Dog,我们自己写的类,但是我们想按照自己制定的规则去重,就比如Person的姓名和年龄,因为Person类是我们自己建的,如果我们没有重写方法,就会去找Object的hashcode方法,这样newPerson()的hashcode就会不同,这样每个都是一个新的,都会输出,即使年龄和姓名一样
publicclassDemo1{ publicstaticvoidmain(String[]args){ HashSetset1=newHashSet<>(); set1.add(newPerson("aing",50)); set1.add(newPerson("bing",10)); set1.add(newPerson("ding",20)); set1.add(newPerson("ding",20)); //运行结果是即使名字年龄一样,也会输出两个,我们如果想要按照自己的规则去重,这样我们一定要重写hashcode和euqals方法 System.out.println(set1);//[Person{name='bing',age=10},Person{name='ding',age=20},Person{name='aing',age=50},Person{name='ding',age=20}] } } classPerson{ Stringname; intage; publicPerson(Stringname,intage){ this.name=name; this.age=age; } @Override publicStringtoString(){ return"Person{"+ "name='"+name+'\''+ ",age="+age+ '}'; } }
我们重写hashcode方法,当hashcode不一样时,就不会比较equals,直接就是不一样,如果hashcode一样,再比较equals方法
publicclassDemo1{ publicstaticvoidmain(String[]args){ HashSetset1=newHashSet<>(); set1.add(newPerson("aing",50)); set1.add(newPerson("bing",10)); set1.add(newPerson("ding",20)); set1.add(newPerson("ding",20)); //根据年龄和姓名比较的 System.out.println(set1);//[Person{name='ding',age=20},Person{name='aing',age=50},Person{name='bing',age=10}] } } classPerson{ Stringname; intage; publicPerson(Stringname,intage){ this.name=name; this.age=age; } @Override publicStringtoString(){ return"Person{"+ "name='"+name+'\''+ ",age="+age+ '}'; } @Override publicbooleanequals(Objecto){ if(this==o)returntrue; if(o==null||getClass()!=o.getClass())returnfalse; Personperson=(Person)o; returnage==person.age&& Objects.equals(name,person.name); } //和属性关联,根据属性的值比较,之所以让age*100;是因为怕有可能出现这个name.hashCode()+age和下一个name.hashCode()+age加起来的值恰好相等,所以age*100,可以避免这种情况的发生 @Override publicinthashCode(){ //returnObjects.hash(name,age); returnname.hashCode()+age*100; } }
TreeSet底层是二叉树,而且TreeSet还是有序的,在String中不仅重写了hashcode,还要调用元素的compareTo方法,String类已经实现了Comparable接口,并重写了compareTo方法,但是如果我们自己写类的话,比如Person来说,如果想要按照自己的规则比,就要重写hashcode方法和实现Comparable接口
publicclassDemo2{ publicstaticvoidmain(String[]args){ TreeSetset=newTreeSet(); set.add("java"); set.add("c"); set.add("php"); set.add("bigdata"); set.add("java"); System.out.println(set);//[bigdata,c,java,php] } }
但是要是自己的类
会报错cannotbecasttojava.lang.Comparable,因为Person会去找compareTo的方法,但是Person类没有实现它,我们要去实现Comparable
publicclassDemo2{ publicstaticvoidmain(String[]args){ TreeSetset1=newTreeSet<>(); set1.add(newPerson1("aing",50)); set1.add(newPerson1("bing",10)); set1.add(newPerson1("ding",20)); set1.add(newPerson1("ding",20)); System.out.println(set1); } } classPerson1{ Stringname; intage; publicPerson1(Stringname,intage){ this.name=name; this.age=age; } @Override publicStringtoString(){ return"Person1{"+ "name='"+name+'\''+ ",age="+age+ '}'; } }
这样我们就可以实现有序了,根据我们的属性
publicclassDemo2{ publicstaticvoidmain(String[]args){ TreeSetset1=newTreeSet<>(); set1.add(newPerson1("aing",50)); set1.add(newPerson1("bing",10)); set1.add(newPerson1("ding",20)); set1.add(newPerson1("ding",20)); System.out.println(set1); } } classPerson1implementsComparable{ Stringname; intage; publicPerson1(Stringname,intage){ this.name=name; this.age=age; } @Override publicbooleanequals(Objecto){ if(this==o)returntrue; if(o==null||getClass()!=o.getClass())returnfalse; Person1person1=(Person1)o; returnage==person1.age&& Objects.equals(name,person1.name); } @Override publicinthashCode(){ returnname.hashCode()+age*100; } @Override publicStringtoString(){ return"Person1{"+ "name='"+name+'\''+ ",age="+age+ '}'; } //根据类的属性进行排序 @Override publicintcompareTo(Objecto){ Person1person=(Person1)o; intnum=name.compareTo(person.name); returnnum==0?age-person.age:num; } }
到此这篇关于简单的理解java集合中的HashSet和HashTree几个重写方法的文章就介绍到这了,更多相关javaHashSet和HashTree重写内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!