Set练习题

题目一:如何在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的结果不一样,所以也能够添加成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值