ArrayList之判断集合里面是否含有某个元素

在ArrayList中判断是否存在某个元素是用contains(Object obj)方法,而
contains()方法是依赖于equals方法的。
众说周知,object里的equals()方法其实是判断两个对象的地址值是否相等,也就相当于这两个对象是否是同一个。
下面我们用一个例子来帮助理解:
简单介绍一下这个例子在干嘛
它就是一个集合里面有一些元素是重合的,我们要做的是将这个集合里的元素放到另一个集合里,然后新集合里的元素是不重合的。

import java.util.*;

class book
{
	private String name;
	private double price;
	book(String name,double price)
	{
		this.name=name;
		this.price=price;
	}

	public String getname()
	{
		return this.name;
	}
	public double getprice()
	{
		return this.price;
	}
}

public class arraylistdemo3 {
	public static void main(String[] args)
	{
		ArrayList list=new ArrayList();
		list.add(new book("c",100.0));
		list.add(new book("c++",150.5));
		list.add(new book("c#",50.4));
		list.add(new book("c#",50.4));
		list.add(new book("java",70.99));
		list.add(new book("java",70.99));
		
		list=preparation(list); 
		
		Iterator it=list.iterator(); 
		while(it.hasNext())
		{
			book b=(book)it.next();
			sop(b.getname()+"    "+b.getprice());
		}
		
	}
	
	public static ArrayList preparation(ArrayList list)
	{
		ArrayList newa=new ArrayList();
		
		Iterator it=list.iterator();
		while(it.hasNext())
		{
			Object obj=it.next();
			if(!newa.contains(obj))
				newa.add(obj);
		}
		return newa;
	}
	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

但是我们运行了之后发先新集合里的元素还是有重合啊,这是为什么呢?
这是因为在preparation()函数里的判断元素是否在newa里的contains()其实是由函数equals来实现的,而contains()里的参数是Object它里面的equals()判断的是对象的地址是否相同,很明显集合list里面的对象都是各自new的,肯定不同,因此,contain()就判断这些对象不再newa里,所以都将其放进去。
所以,为了将不同书名和价格的对象区分,我们就需要将book里的equals()进行覆盖。
以下是更改之后的book类

class book
{
	private String name;
	private double price;
	book(String name,double price)
	{
		this.name=name;
		this.price=price;
	}
	public boolean equals(Object obj)   //覆盖Object里的该方法
	{
		if(!(obj instanceof book))
			return false;
		book b=(book)obj;
			return this.name.equals(b.name) && this.price==b.price;
	}
	public String getname()
	{
		return this.name;
	}
	public double getprice()
	{
		return this.price;
	}
}

因为我不太会表达,所以可以讲得不是很清楚,看不懂或者发现错误的小伙伴再在评论区留言吧(捂脸)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值