- 浏览: 766924 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (179)
- 设计模式 (6)
- 学习笔记 (42)
- java基础 (33)
- struts (1)
- spring (1)
- hibernate (1)
- SSH (0)
- HTML (1)
- javascript (1)
- JQuery (0)
- servlet (0)
- database (14)
- BRIT报表开发 (0)
- MAXIMO开发 (0)
- 经验教训 (2)
- tomcat (1)
- mxgraph (55)
- redis (4)
- redhat (0)
- 学习笔记,eclipse (0)
- linux (9)
- FatJar (1)
- 日志管理 (1)
- MySql (1)
- JointJSJavaScript diagramming library JS在线图形编辑 (0)
- jvm (4)
- quartz (0)
- Oracle (1)
- eclipse (1)
- MINA (1)
- Hadoop (2)
- Mongodb (1)
- Maven (1)
- 管理 (1)
最新评论
-
rogue2yjg:
为什么不直接在IoHandler里的sessionClosed ...
Mina 断线重连 -
hgrapple:
死锁异常DEAD LOCK: IoFuture.await() ...
Mina 断线重连 -
q178266871:
freedomszq 写道重连是出现DEAD LOCK: Io ...
Mina 断线重连 -
freedomszq:
重连是出现DEAD LOCK: IoFuture.await( ...
Mina 断线重连 -
wellway:
fenyun689 写道知道哪里错了。谢谢。我的也出现这个问题 ...
Mina 断线重连
两个对象用equals方法比较为true,它们的Hashcode值相同吗?
答:不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。
下面的话来自JDK:
hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
看看红色的部分,说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?下面这段红色字体说了,必须重写hashcode方法维护...协定!如果你不重写,那么就不能保证hashcode返回相同结果。
换句话说:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。
评论
换句话说:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。
class A1{
private int i;
public A1(int i){
this.i = i;
}
public int getI(){
return i;
}
public boolean equals(Object o){
A2 obj = (A2)o;
return i==obj.getI();
}
}
class A2{
private int i;
public A2(int i){
this.i = i;
}
public int getI(){
return i;
}
public boolean equals(Object o){
A1 obj = (A1)o;
return i==obj.getI();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMain t = new TestMain();
A1 a1 = t.new A1(3);
A2 a2 = t.new A2(3);
System.out.println(a1.equals(a2));
System.out.println(a1.hashCode()==a2.hashCode());
}
}
运行结果,true,false,能给出解释么?
发表评论
-
《Python绝技:运用Python成为顶级黑客》试读感想
2016-03-14 01:28 5825《Python绝技:运用Python成为顶 ... -
《写给大忙人看的Java核心技术》 试读感想
2016-03-13 18:00 2655《写给大忙人看的Java核心技术》 试读感想 ... -
《分布式服务框架原理与实践》试读感想
2016-03-09 19:56 1293《分布式服务框架原理与实践》试读感想 ... -
《架构探险——从零开始写Java Web框架》 试读感想
2015-11-05 15:19 5184《架构探险——从零 ... -
《Java程序员面试宝典(第4版)》 试读感想
2015-11-02 18:42 2798《Java程序员面试宝典 ... -
读《技术管理之巅:如何从零打造高质效互联网技术团队?》有感
2015-08-05 14:51 2689读《技术管理之巅: ... -
Log4j2配置
2015-01-09 18:12 0目前log4j2已经发版到2.1版本,一直都关注,04年底还 ... -
《大型网站系统与Java中间件实践》读后感
2014-06-13 21:44 8357《大型网站系统与Java中间件实践》读后感 这几 ... -
java实现openssl的md5加密
2014-05-26 16:26 1491可信来源:http://hi.baidu.com/huqiw ... -
logback手动启动日志
2014-05-22 17:24 0/** * */ package com.ctf ... -
No grammar constraints (DTD or XML Schema) 处理后导致junit停顿异常
2014-05-21 17:48 9341今天使用eclipse后,看到xml中的警告图标, ... -
logback 异步写入示例
2014-03-13 17:46 10476<?xml version="1.0&qu ... -
JAVA System.getProperty()
2013-07-18 13:22 0java.version Java 运行时环境版本java.v ... -
收藏
2013-06-19 12:19 0昨天去XX公司笔试,结果,有个填空是问我Java检查内存状态 ... -
js画图--mxgraph--codec.html 编辑框
2013-02-19 17:30 2363<!Doctype h ... -
异常:Java compiler level does not match the version of the installed...
2013-02-07 00:05 2182错误信息如下: MyEclipse 下Desc ... -
JAVA程序 通过IP地址 获取MAC地址
2012-08-06 11:51 6414我们都知道通过在电脑上敲 cmd 后,输入ipconfig - ... -
MAXIMO系统Birt报表开发指南--report篇
2012-07-26 09:47 0一、 概述 二、 名词解释 三、 流程 ... -
MyEclipse 安装class文件反编译插件
2012-06-05 10:51 2628本文是我通过学习BlogJava里断点的文章, ... -
Oracle 利用储存过程插入循环插入大量数据方法
2012-05-22 22:38 13897当我们进行测试数据或者进行某种大数据量的时候,可以用一下语句进 ...
相关推荐
重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...
equals 方法和 hashCode 方法都是用于比较两个对象是否相等的,但它们的实现方式不同。equals 方法是比较两个对象的内容是否相等,而 hashCode 方法是根据对象的内容来计算哈希码。在实际开发中,我们需要根据具体...
- 相反,如果两个对象的`hashCode()`值相同,并不能保证这两个对象通过`equals()`方法比较也是相等的。这是因为可能存在不同的对象具有相同的哈希值,这种情况称为哈希冲突。 - 为了避免哈希冲突带来的性能问题,在...
如果我们定义两个字符串 s1 和 s2,並将它们赋值为 "abc",然后使用 equals 方法比较它们,结果当然是 true。 最后,hashcode 方法是一个对象的散列码,它是用来唯一标识一个对象的。hashcode 方法可以将一个对象...
Java 在判断两个对象是否相同时,首先会比较它们的 hashCode 值,如果相同,那么就会比较它们的 equals 方法,如果 equals 方法也返回 true,那么这两个对象就被认为是相同的。 下面是一个简单的示例代码,演示了...
只有当两个对象的Hashcode相同,并且equals方法返回true时,这两个对象才能被认为是相等的。 Hashcode的作用 Hashcode的主要作用是用来标识对象的身份。在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演...
equals()函数是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参照值的比较。什么是对象参照值的比较?就是两个参照变量的值的比较,我们都知道参照变量的值其实就是一个数字,这个数字可以看成...
当两个对象根据 `equals()` 方法判断相等时,它们的 `hashCode()` 方法必须返回相同的值。这是为了确保哈希表能够正确地将相等的对象映射到相同的槽位上。如果两个对象不相等,那么它们的哈希码不一定不同,但不同的...
如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则可能会导致哈希表冲突,影响效率。 `equals()` 方法用于比较两个对象是否相等。在 `Object` 类中,它的默认实现是基于...
2. 判断两个对象的类类型是否相同,可以使用 getClass() 方法来比较类字节码,或者使用 instanceof 关键字来判断左边的对象是否为右边类的实例对象。 3. 根据自己的需求决定哪个属性相同。例如,在 User 类中,可以...
按照 Java 的约定,如果两个对象通过 `equals()` 方法判断为相等,那么它们的 `hashCode()` 值也应该相等。这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 和 `HashSet`)时。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于...
默认情况下,`equals` 方法比较的是两个对象的引用,即是否指向内存中的同一个位置,而 `hashCode` 方法则返回对象的内存地址的一个哈希值。在某些情况下,尤其是当我们自定义类并希望基于特定属性(如学号)判断...
1. **一致性**:如果两个对象相等(通过`equals`方法判断),则它们的`hashCode`值必须相同。 2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名...