HashSet存储对象,应重写hashCode()和equals()方法,以便更好控制集合中的这些元素
类Person
public class Person {
//eclipse source 下自动生成hasCode()和equals 勾选num作为唯一标识
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + num;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (num != other.num)
return false;
return true;
}
int num;
int age;
String name;
//创建构造方法
public Person(int num, int age, String name) {
super();
this.num = num;
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person [num=" + num + ", age=" + age + ", name=" + name + "]";
}
}
我们知道,hashSet中按照hashCode的值存放元素,下面向Set中加入元素,第一个数字为关键字,
如果关键自被修改会怎么样?
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class guess{
public static void main(String[] args) {
Set set = new HashSet();
Person person1 = new Person(1, 10, "阿强");
Person person2 = new Person(2, 10, "阿强");
Person person3 = new Person(3, 10, "阿强");
set.add(person1);
set.add(person2);
set.add(person3);
set.add(null);//HashSet可以加入null
person1.num = 5;
set.remove(person1);
//此时删除的是num为5的hashCode,而原来存储位置是num为1的hashCode.所以删除不起作用
set.add(person1);
//此时会添加person1,虽然集合不存在重复元素
//在重复插入数据时,改变了num,hash值不同,就认定为不同的hash元素
Person person4 = new Person(1, 10, "阿强");
set.add(person4);
//person1已经与新对象person4的num不相同了,可以增加
System.out.println(set.size());
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
可以看作以下三种情况:
1.直接可以插入
2.hash值相同且判读相等,不会保存
3.同一hash值判断不相等,虽然是相同元素但可以放在集合中