集合比较算法(Java)

最近做了一个小测试,对两个集合的比较,目的是想删除出两个集合相同的数据。
分别用List、Map、和Set进行测试
利用List比较
10000用户的数据(6000相同的用户,4000不同的用户),完成比较的时间共耗时1531毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时143735毫秒

利用Map比较
10000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时172毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时359毫秒

利用Set比较
10000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时78毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时156毫秒

Java代码 复制代码
  1. package com.test;   
  2.   
  3. /**  
  4.  * 进行比较的基础数据对象  
  5.  * <br>  
  6.  *文件名:User.java<br>  
  7.  *@author 董利伟<br>  
  8.  *版本:<br>  
  9.  *描述:<br>  
  10.  *创建时间:Mar 25, 2009 9:06:26 PM<br>  
  11.  *文件描述:<br>  
  12.  *修改者:<br>  
  13.  *修改日期:<br>  
  14.  *修改描述:<br>  
  15.  */  
  16. public class User {   
  17.   
  18.     private String name = "";   
  19.     private String id = "";   
  20.        
  21.     public String getName() {   
  22.         return name;   
  23.     }   
  24.   
  25.     public void setName(String name) {   
  26.         this.name = name;   
  27.     }   
  28.   
  29.     public String getId() {   
  30.         return id;   
  31.     }   
  32.   
  33.     public void setId(String id) {   
  34.         this.id = id;   
  35.     }   
  36.   
  37.     public String getKey(){   
  38.         return this.name + "&" + this.id;   
  39.     }   
  40.        
  41.     public int hashCode(){   
  42.         int hash = 1;   
  43.         hash += this.id.hashCode();   
  44.         hash += this.name.hashCode();   
  45.         return hash;   
  46.     }   
  47. }  
package com.test;

/**
 * 进行比较的基础数据对象
 * <br>
 *文件名:User.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 9:06:26 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class User {

	private String name = "";
	private String id = "";
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getKey(){
		return this.name + "&" + this.id;
	}
	
	public int hashCode(){
		int hash = 1;
		hash += this.id.hashCode();
		hash += this.name.hashCode();
		return hash;
	}
}

 

Java代码 复制代码
  1. package com.test;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.HashMap;   
  5. import java.util.HashSet;   
  6. import java.util.List;   
  7. import java.util.Map;   
  8.   
  9. /**  
  10.  * 主要用于初始化集合(其中List的数据是从Map中获取是因为数据在Map中是无序的)  
  11.  * <br>  
  12.  *文件名:CreateUser2.java<br>  
  13.  *@author 董利伟<br>  
  14.  *版本:<br>  
  15.  *描述:<br>  
  16.  *创建时间:Mar 25, 2009 9:33:17 PM<br>  
  17.  *文件描述:<br>  
  18.  *修改者:<br>  
  19.  *修改日期:<br>  
  20.  *修改描述:<br>  
  21.  */  
  22. public class CreateUser2 {   
  23.   
  24.     public static Map UserMapA = new HashMap();   
  25.     public static Map UserMapB = new HashMap();   
  26.        
  27.        
  28.     public static HashSet UserSetA = new HashSet();   
  29.     public static HashSet UserSetB = new HashSet();   
  30.        
  31.     public static List UserListA = new ArrayList();   
  32.     public static List UserListB = new ArrayList();   
  33.        
  34.     public static int aa = 60000;//相同的用户数   
  35.     public static int bb = 40000;//不相同的用户数   
  36.        
  37.     public static void CreateUserList(){   
  38.            
  39.         String name = "张三";   
  40.         int count = 0;   
  41.         //制作600个相同的用户   
  42.         for(int i = 0 ; i < aa ;i++){   
  43.             User user = new User();   
  44.             user.setId(i+"");   
  45.             user.setName(name+i);   
  46.             UserListA.add(user);   
  47.             UserListB.add(user);   
  48.             count++;   
  49.         }   
  50.         //制作400个不相同的用户   
  51.         int test = count;   
  52.         for(int i = test ; i < bb +test ;i++){   
  53.             User user = new User();   
  54.             user.setId(i+"");   
  55.             user.setName(name+i);   
  56.             UserListA.add(user);   
  57.             count++;   
  58.         }   
  59.         test = count;   
  60.         for(int i = test ; i < bb +test ;i++){   
  61.             User user = new User();   
  62.             user.setId(i+"");   
  63.             user.setName(name+i);   
  64.             UserListB.add(user);   
  65.             count++;   
  66.         }   
  67.     }   
  68.        
  69.     public static void CreateUserMap(){   
  70.            
  71.         String name = "张三";   
  72.         int count = 0;   
  73.         //制作600个相同的用户   
  74.         for(int i = 0 ; i < aa ;i++){   
  75.             User user = new User();   
  76.             user.setId(i+"");   
  77.             user.setName(name+i);   
  78.             UserMapA.put(user.getKey(), user);   
  79.             UserMapB.put(user.getKey(), user);   
  80.             count++;   
  81.         }   
  82.         //制作400个不相同的用户   
  83.         int test = count;   
  84.         for(int i = test ; i < bb +test ;i++){   
  85.             User user = new User();   
  86.             user.setId(i+"");   
  87.             user.setName(name+i);   
  88.             UserMapA.put(user.getKey(), user);   
  89.             count++;   
  90.         }   
  91.         test = count;   
  92.         for(int i = test ; i < bb +test ;i++){   
  93.             User user = new User();   
  94.             user.setId(i+"");   
  95.             user.setName(name+i);   
  96.             UserMapB.put(user.getKey(), user);   
  97.             count++;   
  98.         }   
  99.     }   
  100.        
  101.     public static void CreateUserSet(){   
  102.            
  103.         String name = "张三";   
  104.         int count = 0;   
  105.         //制作600个相同的用户   
  106.         for(int i = 0 ; i < aa ;i++){   
  107.             User user = new User();   
  108.             user.setId(i+"");   
  109.             user.setName(name+i);   
  110.             UserSetA.add(user);   
  111.             UserSetB.add(user);   
  112.             count++;   
  113.         }   
  114.         //制作400个不相同的用户   
  115.         int test = count;   
  116.         for(int i = test ; i < bb +test ;i++){   
  117.             User user = new User();   
  118.             user.setId(i+"");   
  119.             user.setName(name+i);   
  120.             UserS[b][/b]etA.add(user);   
  121.             count++;   
  122.         }   
  123.         test = count;   
  124.         for(int i = test ; i < bb +test ;i++){   
  125.             User user = new User();   
  126.             user.setId(i+"");   
  127.             user.setName(name+i);   
  128.             UserSetB.add(user);   
  129.             count++;   
  130.         }   
  131.     }   
  132. }  
package com.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

/**
 * 主要用于初始化集合(其中List的数据是从Map中获取是因为数据在Map中是无序的)
 * <br>
 *文件名:CreateUser2.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 9:33:17 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class CreateUser2 {

	public static Map UserMapA = new HashMap();
	public static Map UserMapB = new HashMap();
	
	
	public static HashSet UserSetA = new HashSet();
	public static HashSet UserSetB = new HashSet();
	
	public static List UserListA = new ArrayList();
	public static List UserListB = new ArrayList();
	
	public static int aa = 60000;//相同的用户数
	public static int bb = 40000;//不相同的用户数
	
	public static void CreateUserList(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListA.add(user);
	        UserListB.add(user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListA.add(user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListB.add(user);
	        count++;
		}
	}
	
	public static void CreateUserMap(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapA.put(user.getKey(), user);
	        UserMapB.put(user.getKey(), user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapA.put(user.getKey(), user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapB.put(user.getKey(), user);
	        count++;
		}
	}
	
	public static void CreateUserSet(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserSetA.add(user);
	        UserSetB.add(user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserS[b][/b]etA.add(user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserSetB.add(user);
	        count++;
		}
	}
}

 

Java代码 复制代码
  1. package com.test;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.Date;   
  5. import java.util.List;   
  6.   
  7. /**  
  8.  * 对List测试  
  9.  * <br>  
  10.  *文件名:Test.java<br>  
  11.  *@author 董利伟<br>  
  12.  *版本:<br>  
  13.  *描述:<br>  
  14.  *创建时间:Mar 25, 2009 8:16:21 PM<br>  
  15.  *文件描述:<br>  
  16.  *修改者:<br>  
  17.  *修改日期:<br>  
  18.  *修改描述:<br>  
  19.  */  
  20. public class TestList {   
  21.   
  22.     public static void execute(){   
  23.            
  24.         List test = new ArrayList();   
  25.         for(int  i = 0 ; i < CreateUser2.UserListA.size();i++){   
  26.             test.add(CreateUser2.UserListA.get(i));   
  27.         }   
  28.         CreateUser2.UserListA.removeAll(CreateUser2.UserListB);   
  29.         CreateUser2.UserListB.removeAll(test);   
  30.     }   
  31.        
  32.     public static void main(String[] args) {   
  33.         long begin = new Date().getTime();   
  34.         CreateUser2.CreateUserList();   
  35.         long end = new Date().getTime();   
  36.         System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");   
  37.         System.out.println("运算前");   
  38.         System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());   
  39.         System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());   
  40.         begin = new Date().getTime();   
  41.         execute();   
  42.         end = new Date().getTime();   
  43.         System.out.println("比较用户共耗时" + (end - begin) + "毫秒");   
  44.         System.out.println("运算后");   
  45.         System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());   
  46.         System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());   
  47.     }   
  48.   
  49. }  
package com.test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 对List测试
 * <br>
 *文件名:Test.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 8:16:21 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class TestList {

	public static void execute(){
		
		List test = new ArrayList();
		for(int  i = 0 ; i < CreateUser2.UserListA.size();i++){
			test.add(CreateUser2.UserListA.get(i));
		}
		CreateUser2.UserListA.removeAll(CreateUser2.UserListB);
		CreateUser2.UserListB.removeAll(test);
	}
	
	public static void main(String[] args) {
		long begin = new Date().getTime();
		CreateUser2.CreateUserList();
		long end = new Date().getTime();
		System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");
		System.out.println("运算前");
		System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());
		System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());
		begin = new Date().getTime();
		execute();
		end = new Date().getTime();
		System.out.println("比较用户共耗时" + (end - begin) + "毫秒");
		System.out.println("运算后");
		System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());
		System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());
	}

}

 

Java代码 复制代码
  1. package com.test;   
  2.   
  3. import java.util.Date;   
  4. import java.util.HashMap;   
  5. import java.util.Iterator;   
  6. import java.util.Map;   
  7.   
  8. import com.test.CreateUser2;   
  9.   
  10. /**  
  11.  * 对Map测试<br>  
  12.  *文件名:Test.java<br>  
  13.  *@author 董利伟<br>  
  14.  *版本:<br>  
  15.  *描述:<br>  
  16.  *创建时间:Mar 25, 2009 8:16:21 PM<br>  
  17.  *文件描述:<br>  
  18.  *修改者:<br>  
  19.  *修改日期:<br>  
  20.  *修改描述:<br>  
  21.  */  
  22. public class TestMap {   
  23.   
  24.     public static void execute(){   
  25.            
  26.            
  27.         //备份用户组b   
  28.         Map m = new HashMap();   
  29.         Iterator itt = CreateUser2.UserMapB.entrySet().iterator();   
  30.         while (itt.hasNext()) {   
  31.             Map.Entry entry = (Map.Entry) itt.next();   
  32.             Object key = entry.getKey();    
  33.             Object value = entry.getValue();    
  34.             m.put(key, value);   
  35.         }   
  36.            
  37.         Iterator it = CreateUser2.UserMapA.entrySet().iterator();   
  38.         int count = 0;   
  39.         while (it.hasNext()) {   
  40.             Map.Entry entry = (Map.Entry) it.next();   
  41.             Object key = entry.getKey();    
  42.             if(CreateUser2.UserMapB.get(key)!= null){   
  43.                 count++;   
  44.                 CreateUser2.UserMapB.remove(key);   
  45.             }   
  46.         }   
  47.         Iterator itm = m.entrySet().iterator();   
  48.         while (itm.hasNext()) {   
  49.             Map.Entry entry = (Map.Entry) itm.next();   
  50.             Object key = entry.getKey();    
  51.             if(CreateUser2.UserMapA.get(key)!= null){   
  52.                 count++;   
  53.                 CreateUser2.UserMapA.remove(key);   
  54.             }   
  55.         }   
  56.         System.out.println(count);   
  57.     }   
  58.   
  59.     public static void main(String[] args) {   
  60.         long begin = new Date().getTime();   
  61.         CreateUser2.CreateUserMap();   
  62.         long end = new Date().getTime();   
  63.         System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");   
  64.         System.out.println("运算前");   
  65.         System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());   
  66.         System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapB.size());   
  67.         begin = new Date().getTime();   
  68.         execute();   
  69.         end = new Date().getTime();   
  70.         System.out.println("比较用户共耗时" + (end - begin) + "毫秒");   
  71.         System.out.println("运算后");   
  72.         System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());   
  73.         System.out.println("CreateUser2.UserMapB.size()=" + CreateUser2.UserMapB.size());   
  74.     }   
  75.   
  76. }  
package com.test;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.test.CreateUser2;

/**
 * 对Map测试<br>
 *文件名:Test.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 8:16:21 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class TestMap {

	public static void execute(){
		
		
		//备份用户组b
		Map m = new HashMap();
		Iterator itt = CreateUser2.UserMapB.entrySet().iterator();
        while (itt.hasNext()) {
            Map.Entry entry = (Map.Entry) itt.next();
            Object key = entry.getKey(); 
            Object value = entry.getValue(); 
            m.put(key, value);
        }
        
        Iterator it = CreateUser2.UserMapA.entrySet().iterator();
		int count = 0;
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            Object key = entry.getKey(); 
            if(CreateUser2.UserMapB.get(key)!= null){
            	count++;
            	CreateUser2.UserMapB.remove(key);
            }
        }
        Iterator itm = m.entrySet().iterator();
        while (itm.hasNext()) {
            Map.Entry entry = (Map.Entry) itm.next();
            Object key = entry.getKey(); 
            if(CreateUser2.UserMapA.get(key)!= null){
            	count++;
            	CreateUser2.UserMapA.remove(key);
            }
        }
        System.out.println(count);
	}

	public static void main(String[] args) {
		long begin = new Date().getTime();
		CreateUser2.CreateUserMap();
		long end = new Date().getTime();
		System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");
		System.out.println("运算前");
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapB.size());
		begin = new Date().getTime();
		execute();
		end = new Date().getTime();
		System.out.println("比较用户共耗时" + (end - begin) + "毫秒");
		System.out.println("运算后");
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());
		System.out.println("CreateUser2.UserMapB.size()=" + CreateUser2.UserMapB.size());
	}

}

 

Java代码 复制代码
  1. package com.test;   
  2.   
  3. import java.util.Date;   
  4. import java.util.HashSet;   
  5. import java.util.Iterator;   
  6. import java.util.Set;   
  7.   
  8. /**  
  9.  * 对Set测试<br>  
  10.  *文件名:TestSet.java<br>  
  11.  *@author 董利伟<br>  
  12.  *版本:<br>  
  13.  *描述:<br>  
  14.  *创建时间:Mar 25, 2009 9:40:40 PM<br>  
  15.  *文件描述:<br>  
  16.  *修改者:<br>  
  17.  *修改日期:<br>  
  18.  *修改描述:<br>  
  19.  */  
  20. public class TestSet {   
  21.   
  22.     public static void execute(){   
  23.            
  24.            
  25.         //备份用户组b   
  26.         Set m = new HashSet();   
  27.         Iterator itt = CreateUser2.UserSetA.iterator();   
  28.         while (itt.hasNext()) {   
  29.             User user = (User) itt.next();   
  30.             m.add(user);   
  31.         }   
  32.         CreateUser2.UserSetA.removeAll(CreateUser2.UserSetB);   
  33.         CreateUser2.UserSetB.removeAll(m);   
  34.     }   
  35.        
  36.     public static void main(String[] args) {   
  37.         // TODO Auto-generated method stub   
  38.         long begin = new Date().getTime();   
  39.         CreateUser2.CreateUserSet();   
  40.         long end = new Date().getTime();   
  41.         System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");   
  42.         System.out.println("运算前");   
  43.         System.out.println("CreateUser2.UserSetA.size()=" + CreateUser2.UserSetA.size());   
  44.         System.out.println("CreateUser2.UserSetB.size()=" + CreateUser2.UserSetB.size());   
  45.         begin = new Date().getTime();   
  46.         execute();   
  47.         end = new Date().getTime();   
  48.         System.out.println("比较用户共耗时" + (end - begin) + "毫秒");   
  49.         System.out.println("运算后");   
  50.         System.out.println("CreateUser2.UserSetA.size()=" + CreateUser2.UserSetA.size());   
  51.         System.out.println("CreateUser2.UserSetB.size()=" + CreateUser2.UserSetB.size());   
  52.     }   
  53.   
  54. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值