Java之Set接口

Java之Set接口

开发工具与关键技术:MyEclipse 10,java
作者:刘东标
撰写时间:2019-05-23
Set 接口(元素不可以重复)
Set 是 Collection 子接口;
Set 和 Collection 基本上一样,一点除外:
Set 无法记住添加的顺序,不允许包含重复的元素。
当试图添加两个相同元素进 Set 集合,添加操作失败,add()方法返回 false。
Set 判断两个对象是否相等用 equals,而不是使用==。
也就是说两个对象 equals 比较返回 true,Set 集合是不会接受这个两个对象的。
常用子类:
HashSet:散列存放
TreeSet:有序存放

hashCode 方法对于 HashSet 的作用

HashSet类是Set接口最常用的实现类,采用hash算法存储数据,具有良好的存储和查找功能。
散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;
线程不安全的,多个线程访问一个 HashSet 要使用同步代码;
HashSet集合元素值允许是null,但是最多只能有一个;//因为Set集合就不可以装重复的对象! hash(翻译为哈希,或散列)算法的功能:
保证通过一个对象快速找到另一个对象;
其算法价值体现在速度,可以保证查询快速执行;
当从HashSet 中访问元素时,HashSet先计算该元素的 hashCode(也就是该对象的hashCode 方 法返回值),然后直接到该 HashCode 对应的位置取出该元素;
在这里对象的hashCode 就好比是数组里的索引,但是不是索引;

HashSet 元素添加
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode()方法来得到该对 象的 hashCode 值,判断已经存储在集合中的对象的 hashCode 值是否与添加的对象的 hashCode 值一致:若不一致:直接添加进去;若一致,再进行 equals 方法比较,equals 方法如果返 回true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;
如果我们重写了 equals 方法,也要重写 hashCode 方法,反之亦然;。
HashSet 集合判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象 的hashCode 方法返回值也相等。
如果需要某个类的对象保存到 HashSet 集合中,覆写该类的 equals()和 hashCode()方法,应 该尽量保证两个对象通过 equals 比较返回true 时,他们的 hashCode 返回也相等。

总结:
很重要的一点:理解!往 HashSet 集合里面存入数据,要先后调用两个方法:hashCode 方法和 equals 方法! !!
备注:使用 eclipse 添加这两个方法。
Eg: package july7;
//hashset方法和equals方法判断输入的对象是否重复!
import java.util.HashSet;
import java.util.Set;
class PersonDemo {
private String name;
public PersonDemo(String name) {
super();
this.name = name;}
@Override
public String toString() {
return "name= " + name;}
// 没有覆写hashcode和equals方法前,显示三次(一样的)。覆写后,只剩下一个 了!说明覆写后方法起作用了,重复的输入不进去!
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
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;
PersonDemo other = (PersonDemo) obj;
if (name == null) {
if (other.name != null)
return false;
}else if (!name.equals(other.name))
return false;
return true;}}
public class Demo12 {
public static void main(String[] args) {
Set s = new HashSet();
s.add(new PersonDemo(“流IO”));
s.add(new PersonDemo(“章泽天”));
s.add(new PersonDemo(“章泽天”));
System.out.println(s);}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值