1.HashSet存放的是无序,不能重复的对象,当添加一个对象的时,它会先检查此对象的
hashCode值是否与集合中对象的hashCode值相等,如果不等,直接将对象加进去,如果相等,则再用equals方法判断,如果返回的是true表示集合中已经存在此对象,不再进行添加,若返回false将对象添加进去
2.简单来说,如果两个对象equals返回true则它们的hashCode值一定相等,如果返回false它们的hashCode不一定不同,因为equals判定的是否为同一个对象,当然这是针对未被重写来说
看下面例子
import java.util.HashSet;
public class SetTest {
public static void main(String[] args) {
HashSet set = new HashSet();
Student s1 = new Student("zhansan",20);
Student s2 = new Student("zhansan",20);
set.add(s1);
set.add(s2);
System.out.println(set);
}
}
class Student {
private String name = null;
private int age = 0;
public Student(String name, int age){
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@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;
final 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;
}
}
如果不对Student类重写equals方法和hashCode方法,当new两个内容相同的对象时,HashSet还是会添加进去,因为两对象的hashCode值不一样,如果像上面那样写了的话则是对内容进行判断,内容相同不再添加
分享到:
相关推荐
重写equals和hashcode方法,学习和进步
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点我们一会再谈。 那么我们还是单独来看hashCode(),为什么HashMap需要用到...
如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合
关于重写equals,hashcode以及compareTo方法!
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧
NULL 博文链接:https://jackosn-liao.iteye.com/blog/528757
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)
更清楚的了解hashcode()和equals()方法。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
Java equals 方法与hashcode 方法的深入解析.rar
本篇文章详细介绍了Java中的equals和hashCode方法详解,Object 类是所有类的父类,非常具有实用价值,需要的朋友可以参考下。
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
主要介绍了Java重写equals及hashcode方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下