今天有个需求,要在listA里面把将也存在于listB里的对象去掉,listA里对象跟ListB中对象不同,比如listA中是student,listB中是teacher,两个对象都有name和age,ListA里面对象包含{(李磊,30),(丽丽,20),(梨花,13)},listB里包含对象{(李磊,14),(丽丽,20)},那么将ListA中(李磊,14)去掉。
因为ListA中对象跟ListB里对象不一样,所以刚开始想的是最简单的方法,对两个list进行遍历。但是当list中对象数量增加时,这种方法就很笨了。
下面是我自己的去重代码,10000个元素的时候,耗时不到1秒,可以接受,但是当元素增加,耗时就成倍增加,性能堪忧。
/** * 测试自己写方法,删除两个list中相同元素 10000个元素耗时994毫秒,20000个元素耗时4542毫秒,30000个元素耗时14194毫秒 * 100000个元素耗时155272毫秒 */ private static void testMyMethod(){ long start = System.currentTimeMillis(); Iterator<Teacher> i = lteacher.iterator(); while(i.hasNext() && lStudent.size() != 0){ Teacher t = i.next(); Iterator<Student> l = lStudent.iterator(); while(l.hasNext()){ Student s = l.next(); if(s.getName().equals(t.getName()) && s.getAge() == t.getAge() && s.getSex() == t.getSex()){ i.remove(); } } } long end = System.currentTimeMillis(); System.out.println(end - start + "毫秒"); System.out.println("剩余:"+lteacher.size()); }
后来通过问大神和自己查资料,改为用jdk自带的removeall方法,并在teacher类中覆写equal方法,性能提高了一个数量级。
/** * 测试removeall方法,不覆盖equeal方法的情况下,list中100000个元素调用removeall 结果是3786毫秒 * 200000个元素,结果是15266毫秒 * 覆盖equeal方法情况下,list中10000个元素,结果是139毫秒,20000个元素,结果是520毫秒,100000个元素耗时32092毫秒 */ private static void test(){ long start = System.currentTimeMillis(); lteacher.removeAll(lStudent); long end = System.currentTimeMillis(); System.out.println(end - start + "毫秒"); System.out.println("剩余:"+lteacher.size()); }
附件是我的测试类和teacher以及student对象类,自己做个网上备份,喜欢的朋友也可以下载来看看,一起学习。