- 浏览: 1022490 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (445)
- Java (22)
- J2EE (18)
- Flex (102)
- Flex-blazeds (1)
- Flex-FABridge (2)
- Flex4 (3)
- CheckStyle (2)
- PowerDesigner (0)
- POI (2)
- Java2Word (2)
- 杂项 (15)
- 日记 (3)
- 数据库-oracle (41)
- 数据库-SQLServer (7)
- 中间件 (1)
- 英语 (8)
- C# (43)
- ASP.net (72)
- ASP.net MVC (28)
- 微软-Entity Framework (19)
- JavaScript (22)
- JQuery (31)
- EasyUI (3)
- VS2010 (4)
- CVS (1)
- Tomcat (3)
- Linux (1)
- 遗留问题 (1)
- iphone (1)
- MAC (0)
- 系统 (2)
- Web Service (4)
- Cache Manager (1)
- PMP (1)
- WCF (10)
- BootstrapJs (1)
- Web API (6)
- Go语言 (0)
- 网络协议 (2)
- Redis (10)
- RabbitMQ (10)
- Git (3)
- Kafka (5)
- ELK (5)
- Nginx (3)
- 测试 (2)
最新评论
-
ygm0720:
Table行拖拽自己实现 -
程乐平:
Flex4开发视频教程(27集)下载http://bbs.it ...
Flex4教程 -
liuweihug:
Jquery+asp.net 后台数据传到前台js进行解析的办 ...
AJAX $.toJSON的用法或把数组转换成json类型 -
weilikk:
谢谢谢谢!!
javascript IE下不能用 trim函数解决方法 -
gxz1989611:
vigiles 写道请问楼主:[Fault] exceptio ...
blazeds推送技术至Flex
重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添
加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个
hashCode()值,那么就无法重新取得该对象了。所以,如果你的hashCode()方法依赖于对象中易变的数据,那用户就要小心了,因为此数据发
生变化时,hashCode()就会产生一个不同的hash码,相当于产生了一个不同的“键”。
Object的hashCode()方法,返回的是当前对象的内存地址。下次如果我们需要取一个一样的“键”对应的键值对的时候,我们就无法得到一样的
hashCode值了。因为我们后来创建的“键”对象已经不是存入HashMap中的那个内存地址的对象了。
我们看一个简单的例子,就能更加清楚的理解上面的意思。假定我们写了一个类:Person (人),我们判断一个对象“人”是否指向同一个人,只要知道这个人的身份证号一直就可以了。
先来个没有重写Code类的hashcode()的例子吧,看看是什么效果:
package com.fit; import java.util.HashMap; /** * 身份证类 * * @author ZYD * */ public class Code { /** * 身份证号码,一旦确定就不能更改 */ private final int id; public int getId() { return id; } /** * 通过构造方法确定身份证号码 * * @param id */ public Code(int id) { this.id = id; } /** * 重写equals()方法 */ public boolean equals(Object o) { // 如果地址一样,则两个对象相同 if (this == o) { return true; } // 如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。 if (o instanceof Code) { Code co = (Code) o; boolean b = (co.id == this.id); return b; } return false; } /** * 重写toString()方法 */ public String toString() { return "【身份证】:" + id; } /** * 测试 * @param args */ public static void main(String[] args) { HashMap<Code, Person> map = new HashMap<Code, Person>(); Person p1 = new Person(new Code(10001),"张三"); Person p2 = new Person(new Code(10002),"李四"); map.put(p1.getCode(), p1); map.put(p2.getCode(), p2); System.out.println("HashMap 中存放的人员信息:\n"+map); //张三改名为张山,身份证号不变。 Person p3 = new Person(new Code(10001),"张山"); map.put(p3.getCode(), p3); System.out.println("张三改名为张山后 HashMap 中存放的人员信息:\n"+map); //查找身份证为10001 的人员信息 System.out.println("查找身份证为:10001 的人员信息:"+map.get(new Code(10001))); } } /** * 人类 * @author Administrator * */ class Person { /** * 每一个成人都有一个身份证 */ private Code code; /** * 姓名 */ private String name; public Code getCode() { return code; } public void setCode(Code code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person() { } public Person(Code code, String name) { this.code = code; this.name = name; } /** * 重写equals()方法 当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。 */ public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof Person) { Person p = (Person) o; boolean b = this.code.equals(p.code) && this.name.equals(p.name); return b; } return false; } /** * 重写toString()方法 */ public String toString() { return "【姓名】:" + name + " "; } }
运行结果:
HashMap 中存放的人员信息:
{【身份证】:10002=【姓名】:李四 , 【身份证】:10001=【姓名】:张三 }
张三改名为张山后 HashMap 中存放的人员信息:
{【身份证】:10002=【姓名】:李四 , 【身份证】:10001=【姓名】:张三 , 【身份证】:10001=【姓名】:张山 }
查找身份证为:10001 的人员信息:null
从上面的结果可以看出:
我们所做的更新和查找操作都失败了。失败的原因就是我们的身份证类: Code 没有覆写 hashCode() 方法。这个时候,当查找一样的身份证号码的键值对的时候,使用的是默认的对象的内存地址来进行定位。这样,后面的所有的身份证号对象
new Code(10001) 产生的 hashCode () 值都是不一样的,所以导致操作失败。
重写Code类的hashcode(),代码上:
package com.fit; import java.util.HashMap; /** * 身份证类 * * @author ZYD * */ public class Code { /** * 身份证号码,一旦确定就不能更改 */ private final int id; public int getId() { return id; } /** * 通过构造方法确定身份证号码 * * @param id */ public Code(int id) { this.id = id; } /** * 重写equals()方法 */ public boolean equals(Object o) { // 如果地址一样,则两个对象相同 if (this == o) { return true; } // 如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。 if (o instanceof Code) { Code co = (Code) o; boolean b = (co.id == this.id); return b; } return false; } /** * 重写hashcode()方法,以身份证号码作为hash码。 * * @return */ public int hashCode() { return id; } /** * 重写toString()方法 */ public String toString() { return "【身份证】:" + id; } /** * 测试 * @param args */ public static void main(String[] args) { HashMap<Code, Person> map = new HashMap<Code, Person>(); Person p1 = new Person(new Code(10001),"张三"); Person p2 = new Person(new Code(10002),"李四"); map.put(p1.getCode(), p1); map.put(p2.getCode(), p2); System.out.println("HashMap 中存放的人员信息:\n"+map); //张三改名为张山,身份证号不变。 Person p3 = new Person(new Code(10001),"张山"); map.put(p3.getCode(), p3); System.out.println("张三改名为张山后 HashMap 中存放的人员信息:\n"+map); //查找身份证为10001 的人员信息 System.out.println("查找身份证为:10001 的人员信息:"+map.get(new Code(10001))); } } /** * 人类 * @author Administrator * */ class Person { /** * 每一个成人都有一个身份证 */ private Code code; /** * 姓名 */ private String name; public Code getCode() { return code; } public void setCode(Code code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person() { } public Person(Code code, String name) { this.code = code; this.name = name; } /** * 重写equals()方法 当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。 */ public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof Person) { Person p = (Person) o; boolean b = this.code.equals(p.code) && this.name.equals(p.name); return b; } return false; } /** * 重写toString()方法 */ public String toString() { return "【姓名】:" + name + " "; } }
运行效果: HashMap 中存放的人员信息:
{【身份证】:10001=【姓名】:张三 , 【身份证】:10002=【姓名】:李四 }
张三改名为张山后 HashMap 中存放的人员信息:
{【身份证】:10001=【姓名】:张山 , 【身份证】:10002=【姓名】:李四 }
查找身份证为:10001 的人员信息:【姓名】:张山
发表评论
-
IDEA设置类注解和方法注解(详解)
2019-09-10 16:03 1513从eclipse工具到IDEA工具的转化,发现IDEA工具配 ... -
IntelliJ Idea 常用快捷键列表
2019-09-06 19:28 378Ctrl+Shift + Enter,语句完成“!”,否定 ... -
WebService--xfire中对集合的配置和操作
2012-04-24 08:48 1473xfire下载URL: http://xfire.codeh ... -
Java,C#,Flex三方通讯(一)
2012-03-19 20:13 1537今天是第一讲: Java调用C#-WebService ... -
Java,C#,Flex三方通讯(一)
2012-03-19 20:11 3今天是第一讲: Java调用C#-WebService ... -
java中instanceof用法
2012-03-13 13:28 1467java 中的instanceof 运算符 ... -
Java中的instanceof关键字
2012-03-05 09:36 1010instanceof是Java的一个二 ... -
Java中ArrayList和LinkedList区别
2012-02-20 08:38 1030一般大家都知道ArrayList和LinkedList的大致区 ... -
jsp指示元素
2011-12-30 15:06 1447指示元素 指示元素的作用是:指示容器在将JSP翻译成serv ... -
jsp脚本元素
2011-12-30 15:06 3350元素与模板数据 JSP页面内容可以分为两种类型,一种是能够被 ... -
jsp 隐藏对象
2011-12-28 13:42 1664隐藏对象即不用声明该 ... -
各数据库驱动的JAVA包 jar
2011-12-28 13:30 1386MySQL ConnectorJ v5.1http://dev ... -
jsp button onclick事件
2011-12-28 13:26 1594<input onclick="doc ... -
比较全面的taglib标签库介绍
2011-12-28 13:25 4555一、定义标签文件(web.xml) <taglib&g ... -
JDK7的推出,oracle独揽Java,是好是坏
2011-09-29 16:51 1457今天在CSDN看到JDK7也推出了lambda语法, 还有JD ... -
java格式化MessageFormat{0},{1}
2009-11-03 17:51 1272String text="hello {0},heh ... -
java读取资源文件代码
2009-08-26 11:53 1712package com.huawei.pms.realtime ... -
java做的定时器
2009-07-15 20:47 1536/** * 具体实现类 */impor ... -
MyEclipse 快捷键
2009-04-24 17:05 1450Ctrl + Shift + O: 引入imports语句Ct ... -
Java中常犯的错误
2008-10-29 12:37 1081作者在文中提到了一些即使是有经验的程序员也常会犯的错误,或许那 ...
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...
为什么重写equals方法,还必须要重写hashcode方法
Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...
例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的哈希码,以便于快速地查找和比较对象。 compareTo()方法是Comparable接口中的一个方法,它用于比较两个...
"Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。
在 Java 中,`equals` 和 `hashCode` 方法是 Object 类中的两个重要方法,它们用于比较对象的相等性。默认情况下,`equals` 方法比较的是两个对象的引用,即是否指向内存中的同一个位置,而 `hashCode` 方法则返回...
#### 二、为什么需要重写equals方法? 1. **提高程序效率**:当两个对象具有相同的业务逻辑上的“身份”时,它们应该被认为是相等的。 2. **增强代码可读性**:重写后的`equals`方法可以根据实际需求来判断对象是否...
现在,让我们深入探讨为什么重写 `equals()` 时要重写 `hashCode()`: 1. **一致性**:一旦对象被创建并赋予了特定的值,其 `equals()` 和 `hashCode()` 方法的结果就应该保持不变,即使在程序的不同执行期间也是...
总结来说,`equals()`和`hashCode()`是Java中用于对象比较和哈希存储的关键方法。它们的正确使用和重写对于确保对象比较的逻辑性和哈希表操作的效率至关重要。在自定义类中,应根据对象的属性和业务逻辑来重写这两个...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...
为什么在重写 `equals()` 后需要重写 `hashCode()` 呢?假设我们有一个自定义类,并且只重写了 `equals()` 方法。现在,有两个内容相等但内存地址不同的对象,当我们将它们放入 `HashMap` 时,`equals()` 方法可能会...
现在,解释为什么在重写 `equals()` 时通常也要重写 `hashCode()`: 1. **一致性**:根据 Java 的 `Object` 类文档,如果两个对象通过 `equals()` 方法比较为相等,那么它们的 `hashCode()` 方法应该返回相同的值。...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...