hashSet根据compareTo()方法的写法不同,hashSet是可以加入重复元素的(即使这2个元素的hashCode相同)。

来源:互联网 发布:松下plc编程实例 编辑:程序博客网 时间:2024/05/17 01:43

用HashSet和TreeSet写了一个方法,当2个对象的hashCode不相同时,HashSet一定可以同时加入这2 个对象的

但是,由于TreeSet需要实现comparab接口,根据实现的方法的不同,也可以加入重复的元素。

当2个对象的hashCode相同时,TreeSet也有可能同时加入这2个对象,但hashSet一定不能。


import java.util.HashSet;import java.util.Set;import java.util.TreeSet;public class TreeSet2 {/** * 当一个树集中的数据实现Comparable接口类创建的对象时, 节点就按照对象的大小关系顺序排列 */public static void main(String[] args) {// TODO Auto-generated method stubTreeSet treeSet = new TreeSet();Set hashSet = new HashSet();Student2 s1 = new Student2("张三", 88);Student2 s2 = new Student2("李", 108);Student2 s3 = new Student2("旺旺", 48);Student2 s4 = new Student2("李", 108);treeSet.add(s1);treeSet.add(s2);treeSet.add(s3);treeSet.add(s4);// 使用下面的第一种comparable那么s4加不进去,因为comparable比较的成绩,成绩相同,// comparable的值是0,认为是相同的对象,就加不进去hashSet.add(s1);hashSet.add(s2);hashSet.add(s3);hashSet.add(s4);System.out.println("treeset*******");for (Object o : treeSet) {//s4不一定能加入(即使hashCode不同)Student2 s = (Student2) o;System.out.println(s.getName() + s.getEnglish());}System.out.println("hashset*********");for (Object o : hashSet) {//在Student2类没有重写equals和hashCode方法时,是可以加入者4个对象的(因为他们的hashCode不同)Student2 s = (Student2) o;System.out.println(s.getName() + s.getEnglish());}}}class Student2 implements Comparable {private String name;private int english;Student2(String name, int english) {this.name = name;this.english = english;}/* * 可以通过交替调试以下下2个compareTo()方法得知,treeset比hashset条件苛刻。 因为treeset需要实现comparable * 接口,比如2个对象的某一个属性相同,那么看comparable是怎样比较这个属性的, * 有可能treeset只能加进去其中“一个”(hashcode不同的情况下),但是在hashcode不同的情况下,hashset一定可以全部加进去。 */@Override//compareTo()方法一、public int compareTo(Object o) {// TODO Auto-generated method stubStudent2 st = (Student2) o;return this.english - st.english;}        //compareTo()方法二、// java 树集Tree中不允许出现大小相等的两个点,// 比如在再加上Student2 s5 = new Student2("天天",48);//  set.add(s4),set.add(s5)都是无效的,如果要允许成绩相同,就要更改compare方法// public int compareTo(Object o)// {// Student2 st = (Student2)o;// if((this.english-st.english)==0)// {// return 1;//表示相同分数2个对象比较时前者"大"// }// else// return (this.english-st.english);//// }public String getName() {return name;}public void setName(String name) {this.name = name;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}//public int hashCode()//{//return this.english;//}////public boolean equals(Object o)//{//if(o instanceof Student2)//{//Student2 stu = (Student2)o;//if(this.name==stu.name&&this.english==stu.english)//{//return true;//}//else//{//return  false;//}//}//else//return false;//} }

结论:可以通过交替调试以下下2个compareTo()方法得知,treeset比hashset条件苛刻。 因为treeset需要实现comparable * 接口,比如2个对象的某一个属性相同,那么看comparable是怎样比较这个属性的,有可能treeset只能加进去其中“一个”(hashcode不同的情况下),但是在hashcode不同的情况下,hashset一定可以全部加进去

以上也重写了equals和hashCode方法,可以交替调试着运行看