去掉List中重复元素
看测试代码:
/**
* 版权所有 (c) 2016,xiaoming有限公司
*/
package ToolTest;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* 类说明:
*
* <pre>
* Modify Information:
* Author Date Description
* ============ =========== ============================
* xiaoming 2016-7-12 Create this file
* </pre>
*
*/
public class removeDuplicate {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<PersonBean> list = new ArrayList<PersonBean>();
PersonBean person1 = new PersonBean();
person1.setAge(11);
person1.setName("xiaom");
list.add(person1);
PersonBean person2 = new PersonBean();
person2.setAge(12);
person2.setName("xiaom");
person2.setmN("ddf");
list.add(person2);
PersonBean person3 = new PersonBean();
person3.setAge(11);
person3.setName("xiaom");
list.add(person3);
System.out.println(list);
System.out.println(list.size());
/**
* 去重方法1
* HashSet<PersonBean> hs = new HashSet<PersonBean>(list);
list.clear();//清除原先list
list.addAll(hs);
System.out.println(list);
System.out.println(list.size());
*/
/**
* 去重方法2
* 判断两个对象相等是否要重写equals 和hashcode方法
* 首先说建议的情况: 比如你的对象想放到Set集合或者是想作为Map的key时,那么你必须重写equals()方法,这样才能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。
必须重写hashCode()的情况:
如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。
最后明白两点就行了:
1.hashCode()方法存在的主要目的就是提高效率。
2.在集合中判断两个对象相等的条件,其实无论是往集合中存数据,还是从集合中取数据,包括如果控制唯一性等,都是用这个条件判断的,条件如下:
首先判断两个对象的hashCode是否相等,如果不相等,就认为这两个对象不相等,就完成了。如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,如果相等,那就认为这两个对象相等。
上面的条件对于任何集合都是如此,只要理解上面的条件,你就明白了,为什么在有些情况下建议重写hashCode().有些情况下,是必须要重写的,只有一个目的,就是提高效率,你想想,如果你重写了hashCode(),只要不满足第一个条件,那就直接可以判断两个对象是不等的,也就不用花费时间再去比较equals了。
最后总结一句话就是,hashCode()方法存在的主要目的就是提高效率,但是如果你想把对象放到散列存储结构的集合中时,是必须要重写的。
*/
for ( int i = 0 ; i < list.size() - 1 ; i ++ ) {
for ( int j = list.size() - 1 ; j > i; j -- ) {
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
System.out.println(list);
System.out.println(list.size());
}
}
PersonBean 代码:
/**
* 版权所有 (c) 2016,xiaoming有限公司
*/
package ToolTest;
/**
* 类说明:
*
* <pre>
* Modify Information:
* Author Date Description
* ============ =========== ============================
* xiaoming 2016-7-12 Create this file
* </pre>
*
*/
public class PersonBean {
private String name;
private Integer age;
private String mN;
/**
* @return the mN
*/
public String getmN() {
return mN;
}
/**
* @param mN the mN to set
*/
public void setmN(String mN) {
this.mN = mN;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public Integer getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(Integer age) {
this.age = age;
}
/* @Override
public boolean equals(Object obj) {
PersonBean s=(PersonBean)obj;
return age.equals(s.age) && name.equals(s.name);
}
@Override
public int hashCode() {
String in = age + name;
return in.hashCode();
} */
}
如果list中元素是一个对象 Object,有多个字段的,根据代码里面注释, 是要在PersonBean 中重写 equals 和hashcode方法的