前言:
在实际开发中我们使用集合,常常会遇到**一个容器中会出现多个重复的对象
**
那么我们可以通常传统的办法将重复的对象去除,也可以使用java中的对象方法进行业务的需求,下面就来说一说:
首先:
准备实体类
public class penBean {
private String type;
private String color;
public penBean(String type,String color){
this.type = type;
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "penBean{" +
"type='" + type + '\'' +
", color='" + color + '\'' +
'}';
}
}
1.传统的方式
List<penBean> penBeanList = new ArrayList<penBean>();
//添加数据
penBeanList.add(new penBean("铅笔", "黑色"));
penBeanList.add(new penBean("中性笔", "黄色"));
penBeanList.add(new penBean("铅笔", "黑色"));
penBeanList.add(new penBean("水彩笔", "蓝色"));
penBeanList.add(new penBean("中性笔", "黄色"));
//新集合
List<penBean> newPenBean = new ArrayList<penBean>();
//遍历集合
for (penBean penBean : penBeanList) {
//判断新集合是否为空
if (newPenBean.isEmpty()){
newPenBean.add(penBean);
}else{
//设置标记
boolean flag = false;
//如果不为空,就循环新集合判断对象属性是否重复,如果重复该标记为true,跳过此循环
for (penBean bean : newPenBean) {
if (bean.getType().equals(penBean.getType()) && bean.getColor().equals(penBean.getColor())){
flag=true;
break;
}
}
//如果不重复直接添加数据
if (!flag) {
newPenBean.add(penBean);
}
}
}
System.out.println("新数据");
for (penBean penBean : newPenBean) {
System.out.println(penBean.toString());
}
新数据
penBean{type=‘铅笔’, color=‘黑色’}
penBean{type=‘中性笔’, color=‘黄色’}
penBean{type=‘水彩笔’, color=‘蓝色’}
虽然结果是我们想要看到的,但是代码有点繁琐,如果我们可以通常运用面向对象的想象岂不是很简单。
2.使用contains方法
使用contains方法 切记要重写equals方法,不然每次返回的结果都是false,原因如下
List<penBean> penBeanList = new ArrayList<penBean>();
//添加数据
penBeanList.add(new penBean("铅笔", "黑色"));
penBeanList.add(new penBean("中性笔", "黄色"));
penBeanList.add(new penBean("铅笔", "黑色"));
penBeanList.add(new penBean("水彩笔", "蓝色"));
penBeanList.add(new penBean("中性笔", "黄色"));
List<penBean> newPenBean = new ArrayList<penBean>();
//遍历集合
for (penBean penBean : penBeanList) {
//判断新集合中是否存在一样的对象存在返回true
if (!newPenBean.contains(penBean)){
newPenBean.add(penBean);
}
}
System.out.println("新数据");
for (penBean penBean : newPenBean) {
System.out.println(penBean.toString());
}
如果传入的对象的属性是个null值,直接返回的值为-1
如果传入的对象的属性是不为null值,进入else里面 然后进入equals方法这也就是为什么要重写equals方法,在equals方法判断,属性值是否重复,重复返回return i,i=0,
如果不重写就只是执行object类静态的方法equals(),返回结果也是return i,i=0 也就是永远返回false,那么每一条数据都将添加到新集合中
源码的执行顺序:
//执行contains方法
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
//如果传入的对象属性不为null执行该语句,
//第一次新集合没有任何数据直接返回-1,添加第一条数据,
//如果即将添加的数据和新集合里面数据重复则返回return i i值为0
if (o.equals(elementData[i]))//调用重写的方法
return i;
}
return -1;
}
//重写的方法
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
penBean penBean = (penBean) object;
//type和color内容相等的时候才返回true
return Objects.equals(type, penBean.type) &&
Objects.equals(color, penBean.color);
}
//执行object类中静态方法equals
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}