HashSet、hashNext、hashCode三者的联系

hashNext:在迭代器中经常用到:判断后面还有没有元素。

Iterator<String> itr = hs.iterator() ;
        while(itr.hasNext()){

     }

HashSet集合:Set集合的子类,不存储重复的元素,同时也不像TreeSet一样添加元素的同时对元素进行排序。

hashCode方法:hashCode方法经常和equals方法一起使用,当自定义类的对象进行比较的时候,首先自动调用hashCode方法,hashCode方法会返回一个数值,如果这个数值不相同,那么就直接向HashSet中添加该对象,如果hashCode值相同,那么就再调用equals方法比较内容,如果equals返回值为false,那么就添加进集合,为true不添加。注意:比较自定义类的对象时,才调用hashCode和equals两个方法。

重写hashCode和equals方法只能尽量去除重复,不能完全去除重复。

 

1. 简单的 HashSet 使用迭代器的 代码:

package com.demo.main;

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

public class Main {

	public static void main(String[] args) {

		HashSet<String> hs = new HashSet<>() ;
		hs.add("f");
		hs.add("g");
		hs.add("c");
		hs.add("b");
		hs.add("b");
		hs.add("a");
		hs.add("b");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("d");
		hs.add("g");
		hs.add("g");
		System.out.println(hs);//[f, g, d, b, c, a] 
		Iterator<String> itr = hs.iterator() ;
		while(itr.hasNext()){
			String str = itr.next() ;
			System.out.print(str+" ");//f g d b c a 
		}
	}

}

系统重写的hashCode方法:

系统重写的equals方法:

面试时候可能会问:
     为什么这里的prime=31?
     1. 31为质数,只能被1和自身整除的数。
     2. 31在质数里面不大不小
     3. 31比较好计算,2的五次方-1 = 31 。

2. 比较自定义类对象 并且 尽量去除重复元素 的 代码如下:

Student.java:

package com.demo.main;

public class Student {
	private String name ; 
	private int age ;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int 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;
		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 != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	} 
	
}

Main.java:

package com.demo.main;

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

public class Main {

	public static void main(String[] args) {

		HashSet<Student> hs = new HashSet<>() ;
		hs.add(new Student("张三",13));
		hs.add(new Student("李四",14));
		hs.add(new Student("王五",15));
		hs.add(new Student("李四",14));
		hs.add(new Student("李四",14));
		hs.add(new Student("李四",14));
		hs.add(new Student("赵六",16));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		hs.add(new Student("陈七",17));
		
		System.out.println(hs);
	}

}

总结: 

1. 比较 自定义类的对象的时候 需要重写 hashCode 和 equals 方法 ,Alt + Shift + s 系统自动重写 。

2. 重写 hashCode 和 equals ,和上火车一样 , hashCode 是 检查车票 , 如果 车票不一样 就 直接 坐到座位上,如果车票一样了,然后再用equals 核对 车票上的信息  , 车票不一样就不需要比较了,车票一样了,才进行比较,找出真正的乘客。

3. 重写了hashCode 和 equals 两个方法 , 只能尽量的去除重复 ,不能保证完全去除重复。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用HashSet时,如果要将自定义对象作为元素存储在其中,则需要重写该对象的hashCode()和equals()方法。 hashCode()方法用于确定元素的哈希值,用于在HashSet中确定元素的位置。 equals()方法用于比较两个元素是否相等。如果两个元素的hashCode()值相同,则会调用equals()方法来确定它们是否相等。 重写这两个方法的规则如下: - hashCode()方法: 1. 在同一对象中多次调用hashCode()应该返回相同的整数。 2. 如果equals()比较两个对象相等,则它们的hashCode()返回值应该相同。 3. hashCode()返回值不一定唯一,不同对象可能会返回相同的整数。 - equals()方法: 1. 自反性: 对于任何非空引用x,x.equals(x)应该返回true。 2. 对称性: 对于任何非空引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)也应该返回true。 3. 传递性: 对于任何非空引用x,y,z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。 4. 一致性:对于任何非空引用x和y,多次调用x.equals(y)应该始终返回相同的结果在使用HashSet的时候,为了保证对象的唯一性,需要重写对象的hashCode和equals方法。 hashCode方法用于生成对象的哈希码,HashSet在添加对象时会使用该哈希码来判断对象是否重复。 equals方法用于判断两个对象是否相等。如果重写了hashCode方法,一般也要重写equals方法。 重写这两个方法时,需要遵循以下规则: 1.如果两个对象相等,那么它们的hashCode值一定相等。 2.如果两个对象的hashCode值相等,那么它们不一定相等。 3.equals方法需要遵循传递性,对称性和自反性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值