HashSet学习笔记——每天一个Java小常识

在学习HashSet之前我们很有必要了解一下哈希值

哈希值

哈希值: 根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值

方法名 说明
public int hashCode() 返回对象的哈希码值

对象的哈希值特点

  • 为保证元素唯一性,需要重写hashcode()和equals()(自己创建的实体类需要注意)
  • 同一个对象多次调用hashCode0方法返回的哈希值是相同的
  • 默认情况下, 不同对象的哈希值是不同的。而重写hashCode0方法,可以实现让不同对象的哈希值相同

HashSet集合概述和特点

  • 底层数据结构是哈希表
  • 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合, 所以是不包含重复元素的集合

重写hashcode()和equals()

没有重写hashcode()和equals():
在这里插入图片描述
重写hashcode()和equals()之后:
在这里插入图片描述

重写两个方法代码实例

测试类:

import java.util.*;

public class Dmeo {
    
    
	public static void main(String[] args) {
    
    
		
		Student student1 = new Student("小哲哲",18);
		Student student2 = new Student("小哲",17);
		Student student3 = new Student("小哲哲",18);
		
		Set<Student> set = new HashSet<Student>();
		set.add(student1);
		set.add(student2);
		set.add(student3);
		for(Student s : set) {
    
    
			System. out . println(s.getName()+s.getAge());
		}
		
	}
}

学生类:(最下方两行代表重写方法,可一键生成)

public class Student {
    
    
	private String name;
	private Integer age;
	public Student(String s,int i) {
    
    
		this.name = s;
		this.age = i;
	}
	public String getName() {
    
    
		return name;
	}
	public void setName(String name) {
    
    
		this.name = name;
	}
	public Integer getAge() {
    
    
		return age;
	}
	public void setAge(Integer age) {
    
    
		this.age = age;
	}
	@Override
	public String toString() {
    
    
		return "Student [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
    
    
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		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;
		Student other = (Student) obj;
		if (age == null) {
    
    
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
    
    
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

hashSet集合元素添加过程

  1. 调用对象的hashCode()方法获取对象的哈希值,根据对象的哈希值计算对象的存储位置。
  2. 该位置是否有元素存在
    没有,存储到该位置,结束;
    有,判断下一条;
  3. 遍历该位置的所有元素,和新存入的元素比较哈希值是否相同
    都不相同,存储到该位置,结束;
    有相同的,判断下一条;
  4. 调用equals()方法比较对象内容是否相等
    返回false,将元素存储到该位置;
    否则说明元素重复,不存储;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaozhezhe0470/article/details/105964752
今日推荐