set里的面试题

package set;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
* @auto dh
* @create 2020-04-30-15:41
*/
class User {
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

public class HashSet003 {
public static void main(String[] args) {
Set<User> set = new HashSet<>();
User u1 = new User("zhangsan", 20);
User u2 = new User("lisi", 30);
set.add(u1);
set.add(u2);
//在 u1的hashCode 位置上age=22,
u1.setAge(22);
//删除是通过 new User("zhangsan",22)计算出的hashCode值去删除,此处不存在值,所以删除失败
set.remove(u1); //false
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='lisi', age=30}]
//通过new User("zhangsan",22)计算出的hashCode值,在此hashCode位置上存值
        set.add(new User("zhangsan",22));
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='zhangsan', age=22}, User{name='lisi', age=30}]
//通过new User("zhangsan",20)计算出的hashCode值存值,虽然此处索引已存值,但是通过equals()比较出来的结果不相等,所以可以存入
        set.add(new User("zhangsan",20));
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='zhangsan', age=20}, User{name='zhangsan', age=22}, User{name='lisi', age=30}]



}
}
posted @ 2020-04-30 15:58  玄空2  阅读(386)  评论(0编辑  收藏  举报