- 浏览: 10495 次
文章分类
- 全部博客 (11)
- java (3)
- dos命令 (0)
- Excel (2)
- 222 (0)
- 11 (0)
- 刷刷刷 (0)
- vb (0)
- File (0)
- dddd (0)
- xml查询指定属性的节点 (1)
- Properties (0)
- bat (0)
- svn (0)
- ss (0)
- 字符串 (0)
- BatchA (0)
- java Ant API (0)
- jQuery2.x不支持IE678 (0)
- javascript (0)
- 字体需求 (0)
- 考情 (0)
- tomact (0)
- mysql (0)
- 备忘录 (1)
- mybatis-->resultMap (0)
- mybatis (0)
- mybatis关于1对1和1对多的配置例子 (0)
- Android (0)
- redis (1)
- spring boot (1)
- spring (0)
最新评论
重写对象的equals方法时,需要重写hashcode。因为两个对象equals的时候,他的hashcode应该是保持一致的。
在set中,元素不允许重复。这个重复是根据对象的内存地址判断的,对于只重写了equals方法的两个实体,equlas比较相等,那这两个对象也可能会放入set中,因为其hashcode可能会不一致。
1.下面是一个java类,重写了equals,但是没有重写hashcode
package compare_equals_hashCode;
public class UserInfo {
private String userName;
private int userAge;
public UserInfo(String userName, int userAge) {
super();
this.userName = userName;
this.userAge = userAge;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
UserInfo userinfo = (UserInfo) obj;
if (userName.equals(userinfo.getUserName())
&& userAge == userinfo.getUserAge())
return true;
return false;
}
@Override
public String toString() {
// TODO Auto-generated method stub
// return super.toString();
return "UserInfo UserName:" + getUserName() + "UserAge:" + getUserAge();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
}
2.下面是一个测试类
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInfo i1 = new UserInfo("zz", 11);
UserInfo i2 = new UserInfo("zz", 11);
Set s = new HashSet();
s.add(i1);
s.add(i2);
// 判断i1的内容是否和i2的相等
System.out.println(i1.equals(i2));
// i1的hashCode
System.out.println(i1.hashCode());
// i2的hashCode
System.out.println(i2.hashCode());
// S 集合的元素个数
System.out.println(s.size());
}
}
3.输出结果
true
6413875
21174459
2
4.可以发现,输出的结果中hashcode不一致,所以I1和I2两个内容相同的对象都成功放入了set集合中。
在set中,元素不允许重复。这个重复是根据对象的内存地址判断的,对于只重写了equals方法的两个实体,equlas比较相等,那这两个对象也可能会放入set中,因为其hashcode可能会不一致。
1.下面是一个java类,重写了equals,但是没有重写hashcode
package compare_equals_hashCode;
public class UserInfo {
private String userName;
private int userAge;
public UserInfo(String userName, int userAge) {
super();
this.userName = userName;
this.userAge = userAge;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
UserInfo userinfo = (UserInfo) obj;
if (userName.equals(userinfo.getUserName())
&& userAge == userinfo.getUserAge())
return true;
return false;
}
@Override
public String toString() {
// TODO Auto-generated method stub
// return super.toString();
return "UserInfo UserName:" + getUserName() + "UserAge:" + getUserAge();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
}
2.下面是一个测试类
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInfo i1 = new UserInfo("zz", 11);
UserInfo i2 = new UserInfo("zz", 11);
Set s = new HashSet();
s.add(i1);
s.add(i2);
// 判断i1的内容是否和i2的相等
System.out.println(i1.equals(i2));
// i1的hashCode
System.out.println(i1.hashCode());
// i2的hashCode
System.out.println(i2.hashCode());
// S 集合的元素个数
System.out.println(s.size());
}
}
3.输出结果
true
6413875
21174459
2
4.可以发现,输出的结果中hashcode不一致,所以I1和I2两个内容相同的对象都成功放入了set集合中。
发表评论
-
组合索引
2019-09-07 16:43 0select * from t_sms_statistics ... -
存储过程
2019-09-05 10:09 0BEGIN -- 定义变量 D ... -
java特性 sream 复制对象用法
2019-08-30 17:29 0List<String> cardCodes ... -
java之序列化
2018-03-10 18:51 01.序列化定义 当两个进程在进行远程通信 ... -
number
2017-10-17 11:33 0package com.paic.icore.ums.comm ... -
json
2017-10-17 11:23 0package com.paic.icoreebcs.comm ... -
sql优化
2017-03-09 11:49 01、关键字段建立索引。 ... -
文本流操作文件
2016-11-09 16:17 0try { / ... -
svg2html
2016-11-07 16:42 0http://vectorconverter.sourcefo ... -
保存xml文件
2016-10-26 15:40 0/** * 保存XML到指定文件(默认使用UT ... -
BufferedReader
2016-09-26 11:26 0BufferedReader.readLine()读取文件第一 ... -
java获取图片大小
2016-09-26 00:07 0package stone; import java ... -
excel 页眉 字体设置
2016-08-03 15:53 0Header header = sheet.getHe ... -
java poi页签拷贝测试
2016-04-08 02:15 0package sort.bean; import j ... -
java POIsheet页签拷贝
2016-04-08 02:14 0package sort.bean; import j ... -
ZIP压缩
2016-03-09 23:55 0package sort.bean; import j ... -
++i和i++不同
2014-06-23 15:58 515++i直接把i里面数据增加1并且变量i作运算结; i++则需要 ... -
exe
2014-05-31 14:52 0[main] CommandLine=-Djava.ext.d ... -
搜索是
2014-04-23 00:12 0http://blog.csdn.net/lyserver/a ... -
MyEclipse下Jad插件安装方法
2014-01-02 19:48 858【安装jad程序】 (拷贝即可,为最新版本Jad 1.5.8 ...
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...
当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...
需要注意的是,在重写equals()方法时,我们需要遵守一些规则,如对称性、反射性、类推性、一致性等。违反这些规则可能会出现意想不到的结果。 hashcode()方法是Object类中的另一个方法,它用于生成对象的哈希码。...
第一种情况:如果类中提供的 equals 方法无法满足需求,则需要重写 equals 方法。例如,在 String 类中,equals 方法用于比较两个字符串的内容是否相同,而不是比较它们的引用。 第二种情况:对于采用哈希算法的...
总结来说,重写 `equals()` 时同时重写 `hashCode()` 是为了保持一致性(保证相等对象的哈希码相同)并优化性能(减少哈希冲突,提高哈希表操作效率)。在设计类时,特别是涉及到对象比较和存储的场景,务必考虑这两...
因此,当重写`equals()`时,通常也需要重写`hashCode()`,以保持两者的一致性。不这样做可能会导致哈希表的行为异常,例如在HashSet中,即使两个对象相等,也可能无法正确识别它们。 例如,假设我们有一个`Coder`类...
为什么重写equals方法,还必须要重写hashcode方法
当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证数据结构如 `HashMap`、`HashSet` 的正确行为。 首先,`equals()` 方法用于比较两个对象是否相等...
这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] =...
Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...
"Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。
在使用 `HashSet`、`HashMap` 等数据结构时,如果重写了 `equals()` 方法但没有重写 `hashCode()` 方法,可能会导致预期的行为不一致。因为这些数据结构依赖于 `hashCode()` 来确定对象的存储位置,而 `equals()` 来...
因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...
6、**何时需要重写hashCode()方法?** 当重写了`equals()`方法时,通常也需要重写`hashCode()`。因为如果不这样做,当两个对象根据`equals()`相等但`hashCode()`不同时,将违反哈希表的性质,导致不期望的行为。 7...
重写`equals()`和`hashCode()`的目的是确保在使用如HashSet这样的集合时,如果两个对象被视为相等(即`equals()`返回`true`),那么它们的`hashCode()`也应该相同。这是因为HashSet依赖于`hashCode()`来确定对象在...
#### 二、为什么需要重写equals方法? 1. **提高程序效率**:当两个对象具有相同的业务逻辑上的“身份”时,它们应该被认为是相等的。 2. **增强代码可读性**:重写后的`equals`方法可以根据实际需求来判断对象是否...
总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...
首先我们看下下面代码及输出和String重写equals和hashcode的源码: package com.zzy.test; public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new ...
默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...