Java软件低级错误(十 ):正确定义hashcode
来源:互联网 发布:java 自定义日志文件 编辑:程序博客网 时间:2024/06/15 01:55
解读:
类A覆写了hashCode方法,并采用A的属性value来生成A的hashCode。使用HashSet作为集合对象,把类A的一个对象a加入到HashSet中后,如果对象a的属性value发生了变化,则a的hashCode()方法返回的值也就发生变化,则无法将对象a从HashSet中删除。
案例:
问题代码:
//重新hashCode
public int hashCode()
{
int result;
result = name.hashCode() + address.toLowerCase().hashCode();
return result;
}
..................
HashSet<Email> set = new HashSet<Email>();
set.add(new Email("abc","xxx.com"));
for(Iterator<Email> i = set.Iterator();i.hashNext();)
{
Email mail = i.next();
mail.address = "kkk.com";
set.remove(mail);
}
System.out.println(set.size());
该程序片段最后的结果是1,修改了HashSet中对象的值后,将对象从HashSet中删除失败了。
正确代码:
预防措施如下:
1、如果覆写了equals方法,必须同时覆写hashCode方法。
2、equals方法和hashCode方法应避免使用易变的属性,避免该对象的hashCode频繁变化。
3、当对象被加入到HashSet(或作为Key加入到HashMap)后,应该避免该对象的hashCode发生变化。
//如果需要对Email的address属性进行修改,那么在重新hashCode方法时,避免使用易变的属性address
public int hashCode()
{
int result;
result = name.hashCode();
return result;
}
- Java软件低级错误(十 ):正确定义hashcode
- Java软件低级错误(十 四):定义equals方法的同时也要定义hashCode方法
- Java软件低级错误: 定义equals方法的同时也要定义hashCode方法
- Java软件低级错误(十 一):正确理解Java的浅clone和深clone
- Java软件低级错误(十 三):短路运算和非短路运算的区别
- Java软件低级错误(十 八):忽略InputStream.skip()返回值的处理
- Java软件低级错误(十 七):对于Map元素的遍历使用entrySet还是KeySet?
- Java软件低级错误(十 六):使用包装器对象带来的低效问题
- Java软件低级错误(十 九):静态变量的初始化问题
- Java软件低级错误(二十 ):正确理解String/StringBuffer/StringBuilder的性能区别
- Java软件低级错误(十 五):大小写转换的正确处理
- Java软件低级错误(十 五):大小写转换的正确处理
- Java十大低级错误
- Java十大低级错误
- Java十大低级错误
- java十大低级错误
- Java十大低级错误
- Java十大低级错误
- java接口
- 认清四种创新谎言-穆利堂推荐
- Javascript获取页面元素的绝对位置
- Jquery 易懂教程
- 数据基本类型
- Java软件低级错误(十 ):正确定义hashcode
- 新一代linux文件系统--btrfs
- 诺基亚西门子笔试面试题及答案解析(软件研发类)
- DROP COLUMN ORA-12991 & ORA-12983
- 为Linux管理员节省时间的十条命令行
- php异常
- rank,dense_rank,rownum
- 网上资源之杂七杂八
- godaddy 的vds上的一个OOM异常