HashSet集合是Set集合的一个分支,是Set接口的一个实现类.它所存储的元素是不可重复的,并且元素都是无序的.当向HashSet集合中添加一个对象时,首先会调用改对象的hashCode()方法来确定元素的存储位置,然后在调用对象的equals()方法来确保该位置没有重复的元素. 当向HashSet中添加自定义对象时候:
public class Test1 {
public static void main(String[] args) {
HashSet hs = new HashSet<>();
hs.add(new Person(“张三”, 23));
hs.add(new Person(“张三”, 23));
hs.add(new Person(“李四”, 24));
hs.add(new Person(“李四”, 24));
hs.add(new Person(“李四”, 24));
for (Person p : hs) {
System.out.println(p);
}
这里是Person重写之后的 hashCode()和equals()方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
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 (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
输出的结果为
Person [name=张三, age=23]
Person [name=李四, age=24]
重写equals后而没有重写hashCode方法时
输出结果为:(每次运行的结果不一样)
Person [name=李四, age=24]
Person [name=李四, age=24]
Person [name=张三, age=23]
Person [name=李四, age=24]
Person [name=张三, age=23]
重写hashCode方法而没有重写equals方法时
输出的结果为:
Person [name=张三, age=23]
Person [name=张三, age=23]
Person [name=李四, age=24]
Person [name=李四, age=24]
Person [name=李四, age=24]
当两个方法都没有重写的时候
输出的结果为:(每次运行的结果不一样)
Person [name=李四, age=24]
Person [name=李四, age=24]
Person [name=张三, age=23]
Person [name=张三, age=23]
Person [name=李四, age=24]
当向HashSet中添加java中的String对象时候:
HashSet hs = new HashSet<>();
hs.add(“a”);
hs.add(“a”);
hs.add(“c”);
hs.add(“d”);
hs.add(“c”);
for (String st : hs) {
System.out.println(st);
}
输出的结果为:
d
c
a
因为String类在Java中就默认继承了Object类斌重写了父类的hashCode方法和equals方法;
我们在存储自定义对象时候也要重写这两个方法;