关于HashSet是如何存取不重复的数据的理解

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方法;
我们在存储自定义对象时候也要重写这两个方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值