Java Set集合 HashSet

HashSet存储对象,应重写hashCode()和equals()方法,以便更好控制集合中的这些元素

类Person

public class Person {
	
	//eclipse source 下自动生成hasCode()和equals 勾选num作为唯一标识
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + num;
		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 (num != other.num)
			return false;
		return true;
	}

	int num;
	int age;
	String name;
	
	//创建构造方法
	public Person(int num, int age, String name) {
		super();
		this.num = num;
		this.age = age;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [num=" + num + ", age=" + age + ", name=" + name + "]";
	}

	
	
}

 我们知道,hashSet中按照hashCode的值存放元素,下面向Set中加入元素,第一个数字为关键字,

如果关键自被修改会怎么样?

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class guess{
	public static void main(String[] args) {
	
		Set set = new HashSet();
		Person person1 = new Person(1, 10, "阿强");
		Person person2 = new Person(2, 10, "阿强");
		Person person3 = new Person(3, 10, "阿强");
		
		set.add(person1);
		set.add(person2);
		set.add(person3);
		set.add(null);//HashSet可以加入null
		
		person1.num = 5;
		set.remove(person1);
		//此时删除的是num为5的hashCode,而原来存储位置是num为1的hashCode.所以删除不起作用
		
		set.add(person1);
		//此时会添加person1,虽然集合不存在重复元素
		//在重复插入数据时,改变了num,hash值不同,就认定为不同的hash元素
		
		Person person4 = new Person(1, 10, "阿强");
		set.add(person4);
		//person1已经与新对象person4的num不相同了,可以增加
		
		System.out.println(set.size());
		
		Iterator iterator = set.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
			
		}
	}

}

可以看作以下三种情况:

1.直接可以插入

 2.hash值相同且判读相等,不会保存

3.同一hash值判断不相等,虽然是相同元素但可以放在集合中

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券