一,回答标题的问题
Person对象
public class Person {
private String userName;
private int age;
public Person(String userName, int age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(userName, person.userName);
}
@Override
public int hashCode() {
return Objects.hash(userName, age);
}
}
Main方法
public static void main(String[] args) {
HashSet<Person> hSet = new HashSet<Person>();
Person p1 = new Person("Hirate Yurina",23);
Person p2 = new Person("张钧甯",23);
Person p3 = new Person("中条彩未",23);
hSet.add(p1);
hSet.add(p2);
hSet.add(p3);
hSet.add(new Person("张钧甯",23));
Iterator<Person> iterator = hSet.iterator();
while (iterator.hasNext()){
System.out.println("元素分别为:"+iterator.next()+" ,");
}
System.out.println("元素个数:"+hSet.size());
System.out.println("元素:"+hSet.toString());
}
注意:
如果不重写Person的HashCode和equals方法的话,jvm会判断这两个张钧甯是不同的对象,所以此处的输出为:
元素个数:4
元素:[Person{userName=‘Hirate Yurina’, age=23}, Person{userName=‘中条彩未’, age=23}, Person{userName=‘张钧甯’, age=23}, Person{userName=‘张钧甯’, age=23}]
以上会包含重复的张钧甯元素。
所以,如果保证set元素不重复的话,一定要重写Person的HashCode和equals方法。
元素个数:3
元素:[Person{userName=‘Hirate Yurina’, age=23},
Person{userName=‘中条彩未’, age=23}, Person{userName=‘张钧甯’, age=23}]
二,小常识
你说神奇不神奇:31 * i = (i<<5) - 1,不信你自己找个数带入i中试试看!
public int hashCode(){
// (1)31是个质数,减少散列冲突
// (2)31提高执行效率,31*i=(i<<5)-1
final int prime = 31;
int result = 1;
result = result * prime + age;
result = result * prime +((name == null) ? 0:name.hashCode());
return result;
}