HashSet的对象必须实现hashCode()和equals()
来源:互联网 发布:汉邦网络摄像机默认ip 编辑:程序博客网 时间:2024/06/05 03:14
java中hashset跟对象重载的equals和hashcode方法到底有什么关系?
以下面里面分析:
import java.util.HashSet;
public class EmployeeTest
{
static int count = 0;
static public class Demo
{
public Demo(String s){
mStr = s;
}
public boolean equals(Object object){
boolean b = mStr.equals(((Demo)object).mStr); // 尝试修改代码返回true或false
return b;
}
public int hashCode(){
return ++count; // 尝试修改代码返回定值或变值
}
public String mStr;
}
public static void main(String[] args)
{
HashSet<Demo> set = new HashSet<Demo>();
boolean b = false;
b = set.add(new Demo("aa")); // hashset的add方法文档中指出当 !obj1.equals(obj2) 时才会进行插入
b = set.add(new Demo("bb"));
b = set.add(new Demo("bb"));
System.out.print(set.size());
}
}
如果hashcode函数返回一个定值,即所有对象的hashcode相同时,当尝试插入第二个数据(或以上)时,会发现程序还会去调用equals方法,并且该函数返回false时才回插入hashset;当hashcode返回不同时会忽略equals函数并直接插入hashset。
总结,hashset先调用对象的hashcode函数来进行散列,当散列到不同位置时,则认为对象不相同且进行插入操作(不用判断equals函数);当散列到同一个位置才会调用对象的equals函数来进行比较,只当equals返回false则认为两个对象不相等才会进行插入操作,否则认为两个对象相同而不进行插入操作。
自定义对象,重载equals和hashcode时,应该保证两个对象的hashcode的比较结果,和,两个对象的equals函数比较结果,一样。
本例子只是为了说明问题。
刚刚开始使用java语言,以上都是通过调试数据推断出来的,更好的办法应该是读源代码。如果有错,欢迎指出。
1 0
- HashSet的对象必须实现hashCode()和equals()
- 为什么使用HashSet储存对象时必须重写equals和hashcode方法
- HashSet 的使用 自定义hashCode和equals
- HashSet集合hashcode和equals的影响
- 用作Map的键必须实现equals和hashCode方
- hashset重写hashcode和Equals
- hashcode()和equals()及HashSet判断对象相等
- hashcode()和equals()及HashSet判断对象相等
- hashmap和hashset的理解,关于hashcode和equals。
- HashSet的hashcode()和equals()方法的分析说明
- Hashset、Hashmap、Hashtable与hashcode()和equals()的密切关系
- JCF框架hashset中hashcode()和equals()的用法
- hibernate之什么时候必须实现equals()和hashCode()方法?
- hashset中hashcode和equals方法
- HashSet如何重写了hashcode()和equals()
- HashSet以及重写equals()和hashCode()
- 实现equals()和hashCode()
- JAVA HashSet equals hashcode
- 12硬币中有一个不知道轻重的假币,用天平将它找出来
- OneNote 2013 快捷键
- java基础之集合框架——Collections-同步和非同步
- Shader入门指南【2】
- iCloud De-duplication
- HashSet的对象必须实现hashCode()和equals()
- Chromium硬件加速渲染机制基础知识简要介绍和学习计划
- validate校验容易疏忽的问题
- Gradle compile
- JDk以及各个版本的区别
- 【干货】大学生应该这样规划自己的学习和生活!
- EventListenerTouchOneByOne::create() 单点触摸
- Xcode自动化版本编号
- 【笔记】HttpHandler与HttpMoudle