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;
	}
}

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

发布了5 篇原创文章 · 获赞 1 · 访问量 114

猜你喜欢

转载自blog.csdn.net/weixin_42371679/article/details/104398431