java学习笔记--第二天(list去重问题)

       今天有个需求,要在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对象类,自己做个网上备份,喜欢的朋友也可以下载来看看,一起学习。

猜你喜欢

转载自709002341.iteye.com/blog/2250904