【java】第二十二节课(HashSet)

博客介绍了使用HashSet建立对象、添加元素及两种遍历方法。探讨添加自定义类对象时的去重问题,测试发现默认不去重,给出重写hashCode和equals方法的解决办法。还阐述了HashSet存储规则,先对对象hash确定位置,再判断是否已有元素及是否相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用HashSet建立对象、添加元素并使用两种方法遍历
代码实现

public class SetDemo {

	public static void main(String[] args) {
		Set<String> set = new HashSet();
		set.add("猴子");
		set.add("八戒");
		set.add("唐僧");
		set.add("沙僧");
		
		Iterator<String> iter = set.iterator();
		while(iter.hasNext()) {
			String name = iter.next();
			System.out.println(name);
		}
		
		System.out.println("---------这是一条分隔线---------");
		for(String str : set) {
			String name = str;
			System.out.println(name);
		}
	}
}

2、问题:如果添加的是自定义类的对象,那么还能自动去重吗?
不确定咱就测试一下
代码实现:

//使用HashSet存储自定义类的对象
		Set<Student> stu = new HashSet();
		stu.add(new Student("猴子","201801",99));
		
		//名字不一样,学号一样
		stu.add(new Student("八戒","201801",99));
		
		//名字一样,学号不一样
		stu.add(new Student("猴子","201802",99));
		
		//名字、学号都一样
		stu.add(new Student("猴子","201801",99));
		
		//名字学号都不一样
		stu.add(new Student("唐僧","201803",99));
		
		Iterator<Student> iter1 = stu.iterator();
		while(iter1.hasNext()) {
			Student stu1 = iter1.next();
			System.out.println(stu1);
		}

结果输出的结果发现,它完全不去重,所以jvm也没那么智能。。。。。

解决方法:
第一步:重写hashCode方法(以借助学号去重为例)
代码实现:

public int hashCode() {
		return stuNumber.hashCode();
	}

第二步:重写equals方法
代码实现:

public boolean equals(Object obj) {
		if(obj == this ) {
			return true;
		}else {
			if(obj != null && obj instanceof Student) {
				Student stu = (Student) obj;
				if(stu.stuNumber.equals(stuNumber)) {
					return true;
				}
			}
		}
		return false;
	}

注:
如果要出现下图界面需要使用 :ctrl + shift + t
在这里插入图片描述3、存储的规则:
(1)将要存出的对象进行hash,进而得到要对象存储的位置
(2)检查要存储的位置是否有元素,如果不存在,则直接存储到当前位置,如果存在,判断将要存储的元素与当前位置已有的元素是否相等(使用equals),如果相等则不改变,如果不相等会通过单链表形式存储到当前位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值