本文共 3189 字,大约阅读时间需要 10 分钟。
文章来源:http://blog.csdn.net/lxqluo/article/details/31394393
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否public static boolean isSetEqual(Set set1, Set set2) { if (set1 == null && set2 == null) { return true; // Both are null } if (set1 == null || set2 == null || set1.size() != set2.size() || set1.size() == 0 || set2.size() == 0) { return false; } Iterator ite1 = set1.iterator(); Iterator ite2 = set2.iterator(); boolean isFullEqual = true; while (ite2.hasNext()) { if (!set1.contains(ite2.next())) { isFullEqual = false; } } return isFullEqual; }
在使用treeset和hashset重复添加元素时,发现二者在比较自定义对象元素上不一样,如下例假设record对象包含两个信息,一个为int age,一个为String nameSet答:t0= new TreeSet (); t0.add(new record(1,"lAn")); t0.add(new record(1,"lAn")); t0.add(new record(1,"lAn"));System.out.println(t0);treeset的输出为[1 lAn]将相同元素添加到hashset中Set t1= new HashSet ();t1.add(new record(1,"lAn"));t1.add(new record(1,"lAn"));t1.add(new record(1,"lAn"));System.out.println(t0);输出为[1 lAn,1 lAn,1 lAn]为什么会有这种情况呢? hashset和treeset是怎么比较元素相等的?
我想看下你得record类,问题可能出在你得record类里面,你是不是重写了hashcode方法?
刚才看了一下,问题出在你得record类应该,你没有生成一个hashcode()方法,所以你得hashcode方法继承自object类
object类的hashcode算法hashcode算出来的结果就是该对象在内存中的地址的十进制表示,你每次都是new出来的record,所以他们的内存地址一定是不一样,那么这就说明他们的hashcode不一样,而hashset对于相同对象的比较是使用hashcode的,他们的hashcode不同,那么自然被hashset认为是不一样的对象了,所以有了你的结果,建议record类里面写一个hashcode方法,可以利用Eclipse或MyEclipse的生成的那个hashcode算法
然后说说treeset
boss来了,等下给你补上
好了,boss走了,吓死我了
对于你的treeset,他是用compareTo方法判断是否相同,treeset要求你必须给record类实现comparable接口,你应该写了,但是这个接口有个方法compareTo你实现的时候可能是用了默认的吧,默认的compareTo方法只有一句,就是return 0;所以对于任何两个对象来说他们compareTo都是相同的,那么treeset就会认为这些record都是一样的,没区别,所以就只有一条
,建议可以利用下Eclipse或MyEclipse的equals算法生成,然后在compareTo方法里调用equals方法比较
综上所述
hashset用hashcode方法来实现比较是否相同
而treeset用comparable接口的compareTo方法比较
有问题可以追问,
打了这么多字给分吧~~
希望能帮助你
我人还是太好了,附带着还是把record的代码发给你吧,免得你迷糊
public class record implements Comparable{ private int age; private String name; public record(int age,String name){ // TODO Auto-generated constructor stub this.age=age; this.name=name; } @Override public int compareTo(Object o) { // TODO Auto-generated method stub if(equals(o)){ return 0; }else { return -1; } } @Override public String toString() { return "record [age=" + age + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; record other = (record) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }