题目一:如何在List中去除重复数据,要求做法尽量简单一些
分析:
如果一个一个去equals效率低
而Set进行比较效率就特别高,通常利用Set进行重复数据的过滤
set.addAll(list),添加的过程中重复的元素是加不进去的,就自动过滤掉了
如果是除掉重复的自定义的类,因为用了Set,所以自定义类要重写equals和hashCode方法
public static List duplicateList(List list) {
HashSet set = new HashSet();
set.addAll(list);
return new ArrayList(set);
}
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(2));
list.add(new Integer(4));
list.add(new Integer(4));
List list2 = duplicateList(list);
for (Object integer : list2) {
System.out.println(integer);
}
}
程序的输出结果为:
1
2
4
题目二:
其中Person类中重写了hashCode()和equals()方法
Person类的属性是id和name
HashSet set = new HashSet();
Person p1 = new Person(1001,"AA");
Person p2 = new Person(1002,"BB");
set.add(p1);
set.add(p2);
p1.name = "CC";
set.remove(p1);
System.out.println(set); //此时是输出"BB","CC"对应的数据,为什么p1没有被删除?
set.add(new Person(1001,"CC"));
System.out.println(set);
set.add(new Person(1001,"AA"));
System.out.println(set);
分析: HashSet底层是数组,把p1,p2存进来,p1,p2都是通过哈希值经过一些算法处理确定在数组中存放的是哪个位置
set中remove是判断这个要删除的这个对象有没有,有才进行删除,所以对于Set来说不会像List那样一个一个去找,会先计算哈希值,我们用Set的目的就是先去进行哈希值的计算,通过算出来的哈希值去得到数组中的某一个位置,这个位置有极大的概率不在p1存放的位置,因为现在p1中的属性的name改成了CC,p1所在的位置是用当初的AA得到哈希值计算得到的,所以现在得到的是另外一个位置,发现是空的,所以并没有remove掉p1,所以这两个东西都在。之后new完的CC能够被加进来,因为使用它的哈希值去算,会得到一个新的位置,那个位置是空的,所以直接添加成功,add“AA”的那个也加进去了,AA这个算的值是现在p1所在的位置,又因为equals的结果不一样,所以也能够添加成功