覆写hashCode equal方法
1.为什么要重写hashCode方法?
当自己要新建一个class,并要把这个类放到HashMap的时候,需要覆写这两个办法。如果不覆写,放入两个新的对象,可能会是不相等的。
在java的集合中,判断两个对象是否相等的规则是:
- 首先,判断两个对象的hashCode是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,则判断两个对象用equals运算是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,认为两个对象相等
2.核心注意
- equals()相等的两个对象,hashcode()一定相等;
- equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
3.Override
假设class有下面3个成员变量:
- private Object property1;
- private Object property2;
- private Object property3;
```java
@Override
public int hashCode() {
int result = 17;
result = result * 37 + property1.hashcode;
result = result * 37 + property2.hashcode;
result = result * 37 + property3.hashcode;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (obj instanceof Point) {
Point p = (Point) obj;
if (this.x == p.x && this.y == p.y)
return true;
}
return false;
}
```
想更好的实现还可以使用
Apache Commons Lang包来重写hashCode()和equals()方法。
4.为什么还要设计hashcode()方法,一个equals()不就足够了吗?
只要一个equals()方法肯定可以保证代码的执行,但是这样做却忽略了一个重要指标–——效率。
- hashcode()的存在可以大大地提升效率。试想,如果仅使用equals()方法,在往一个HashSet中添加元素的时候,需要将这个元素与HashSet中的每个元素进行euqals()比较,时间为O(N),
- 而如果使用hashcode()方法,根据该元素的hashcode值,可以直接定位到它的位置,
- 如果该位置没有元素,则直接插入(equals()肯定不相等),否则,再使用equals()对比,相等则丢弃,不必插入,不相等则可以使用其他方法(如向后移动一位等),时间复杂度降至O(1)。
想想HashMap的get()方法是如何工作的。
因此,重写equals()方法总是要重写hashcode(),请务必遵守。
覆写hashCode equal方法的更多相关文章
- [改善Java代码]覆写equals方法必须覆写hashCode方法
覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...
- java覆写hashcode方法
覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域): 3, boolean型,计算(f? 0 ...
- 为什么覆写equals()方法的时候总是要覆写hashcode()?
要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...
- 覆写equals方法为什么需要覆写hashCode方法
覆写equals方法必须覆写hashCode方法,是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢? void test() { // Person类的实例作为Map的k ...
- 使用第三方工具覆写Object中方法
我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...
- 为什么覆写equals必须要覆写hashCode?
============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============= ...
- (强制)要求覆写equals必须覆写hashCode(原理分析)
hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等.众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快.对象通过调用Obje ...
- [改善Java代码]覆写变长方法也循规蹈矩
建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...
- hashcode(),equal()方法深入解析
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
随机推荐
- app间互相启动及传参数
http://blog.sina.com.cn/s/blog_13bc6705b0102wmc5.html http://blog.csdn.net/iefreer/article/details/8 ...
- iOS开发——打开手机相册,获取图片
1.添加代理UIImagePickerControllerDelegate 2.设置点击跳转事件 - (IBAction)picButton:(UIButton *)sender { NSLog(@& ...
- JS数字金额大写转换
/** 数字金额大写转换(可以处理整数,小数,负数) */ var digitUppercase = function(n) { var fraction = ['角', '分']; var digi ...
- xlrd(开excel表格)
打来表格 wb = xlrd.open_workbook('example.xlsx') 选择sheet sh=wb.sheet_by_index(序号) 表格的行数 sh.nrows 选取第m行第n ...
- Sed替换 内容带反斜杠(/)
sed "s#XXXX#${NAME}#" $MAIL_CONTENT > /tmp/MAIL_CONTENT1.tmp -----不论什么字符,紧跟着s命令的都被认为是新的 ...
- iOS 更改启动视图
TMMainViewCtrl *main = [[TMMainViewCtrl alloc] init]; self.window.rootViewController = main;
- js控制div显示与隐藏
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Chrome调试大全
作为一名前端开发者,打交道最多的可能是和浏览器.市面上各种浏览器多不胜数,主流的有Chrome,Firefox,Safari,IE,Opera,非主流的如360,遨游,QQ浏览器,搜狗浏览器,据说淘宝 ...
- 才一年,H5的发展就成这样了......
关于H5的发展,分享几个最近看到的惊人数据和新闻: 1.截至2015,有80%的App将全部或部分基于HTML5.这意味着大部分App的内容都将是以网页的形式呈现,典型的例子包括微信.Facebook ...
- 读取SQLServer数据库存储过程列表及参数信息
得到数据库存储过程列表: select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name ...