set不能存放重复数据,那么,set是如何区分两个数据是否重复呢?
实际上两个重复的数据p2和p4都被添加进去了。
HashSet,这个集合类继承于Set接口,爷爷是Collection接口。首先他接受一个参数的泛型,泛型的作用就是在编译期去严格检查输入类型,HashSet添加元素时,需要对这个泛型类的hashCode值进行判断,测试是否为重复元素,如果一样,再测试equals结果。
所以以上的代码得改写成如下
这样就可以实现不添加重复数据了。
set的另一个实现是treeset,treeset是靠实现Comparator接口来对数据进行排序,所以不需要上面的equals方法了。
treeset的实现是
public class Person{
private int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new HashSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}
}
实际上两个重复的数据p2和p4都被添加进去了。
HashSet,这个集合类继承于Set接口,爷爷是Collection接口。首先他接受一个参数的泛型,泛型的作用就是在编译期去严格检查输入类型,HashSet添加元素时,需要对这个泛型类的hashCode值进行判断,测试是否为重复元素,如果一样,再测试equals结果。
所以以上的代码得改写成如下
public class Person{
private int id;
private String name;
public boolean equals(Object p){
if(((Person)p).getId()==this.getId()){
return true;
}else{
return false;
}
}
public int hashCode(){
return 0;
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这样就可以实现不添加重复数据了。
set的另一个实现是treeset,treeset是靠实现Comparator接口来对数据进行排序,所以不需要上面的equals方法了。
treeset的实现是
public class Person implements Comparable<Person>{
private int id;
private String name;
public int compareTo(Person person) {
if(this.getId()>person.getId()){
return -1;
}else if(this.getId()==person.getId()){
return 0;
}else{
return 1;
}
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new TreeSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}
}