List ADD时去除重复对象代码

我们都知道

Set:实现Set接口的类里面的内容是没有顺序,并且不能重复;
List:实现List接口的类里面的内容是有顺序,并且可以重复;
Map:实现-->Map接口的类定义了键(key)-值(value)对的方法。

所以我们这里面要去除重复的对象,那么就要用到set类。

在set的时候其实是很简单的:

List<ProductInfoDTO> products ;
  Set set=new HashSet();
  for (int i = 0; i < sp.length; i++) {
   ProductInfoDTO product = productsInfoService.dingfengSearchProduct(id);
   if(!set.contains(product)){
//判断set中是否包含此类,这里就是去验证productInfoDTO中的equals(),hashCode(),toString()方法来比较,我自己重写的是只判断productId属性。
    set.add(product);
   }
  }
  products = new ArrayList<ProductInfoDTO>(set);


//这里需要重写ProductInfoDTO中的equals(),hashCode(),toString()方法
public boolean equals(Object obj)
	{
	   if(obj instanceof ProductInfo)
	   {
 		ProductInfo productInfo = (ProductInfo)obj;
 			return productId.equals(productId);
	   }
	   return super.equals(obj);
	}
	
	public int hashCode()
	{
	   return productId.hashCode();
	}
	public  String toString()
	{
	   return productId;
	}

 

那为什么在重写equals方法时都要重写equals方法呢:
首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)   

自我的理解:由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的

次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的

话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode

就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据

只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写

hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的

以上说明性文字转自:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html

但是为什么给set集合add字符串的时候就会自动udiao重复数据呢?

因为java已经为String类重写了equals(),hashCode(),toString()方法,所以我们是可以直接拿来使用的,还有Integer.等等,需要重写的有自己的java类。


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值