267/268Set集合储存元素不能重复的原理和Hashset储存自定义类型元素
Set集合储存元素不能重复的原理
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
String a1 = new String("aaa");
String a2 = new String("aaa");
set.add(a1);
set.add(a2);
set.add("乐迪");
set.add("梁志超");
set.add("伞兵一号卢本伟");
System.out.println(set);
}
add方法会调用1的 hashcode方法,计算字符串"abc"的哈希值,哈希值是96354在集合中找有没有96354这个哈希值的元素,发现没有就会把a1存储到集合中
add方法会调用g2的 hashcode方法,计算字符串"abc"的哈希值,哈希值是96354在集合中找有没有96354这个哈希值的元素,发现有(哈希冲突2会调用equa1s方法和哈希值相同的元素进行比较g2.equa1s(31),返回true两个元素的哈希值相同,equa1s方法返回true,认定两个元素相同就不会把92存储到集合中
Hashset储存自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保 证HashSet集合中的对象唯一
Hashset存储自定义类型元素
set集合报错元素唯一:
存储的元素(String, Integer, . . .Student , Person...) ,必须重写hashCode方法和equals
方法要求:
同名同年龄的人,视为同一个人,只能存储一次
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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 static void main(String[] args) {
//创建Hashset集百仔1储Person
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("哈嗨", 18);
Person p2 = new Person("嗯哼", 18);
Person p3 = new Person( "哈嗨嗨", 19);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p1==p2);
System.out. println(p1.equals(p2));
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set) ;
}
public class Person {
private String name;
private int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@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;
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Demo03HashSetSavePerson {
public static void main(String[] args) {
//创建HashSet集合存储Person
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("乐迪", 18);
Person p2 = new Person("乐迪", 18);
Person p3 = new Person("乐迪", 18);
System.out.println(p1.hashCode());//776686
System.out.println(p2.hashCode());//776686
System.out.println(p1 == p2);//false
System.out.println(p1.equals(p2));//true
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);//[Person [name=乐迪, age=18]]
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix