覆盖equals时,遵守通用约定

对equal方法的覆盖看起来非常easy,可是有很多情况是容易导致错误,最好的避免这些错误的办法
就是不覆盖equals方法.

必须遵循的原则:
自反性--对于不论什么非空的引用 x,有x.equals(x) 为true;
对称性--对于不论什么非空的引用x,y,假设x.equals(y) 为true,则必有y.equals(x) 为true;
传递性--对于不论什么非空的引用x,y,z,假设x.equals(y) 为true且y.equals(z) 为true,
               则必有x.equals(z) 为true;
一致性--对于不论什么非空的引用x,y,仅仅要equals的比較操作在对象中所用信息没被改动,
            多次调用x.equals(y)会一致为TRUE或者一致为FALSE。

对于不论什么非空x,x.equals(null) 为FALSE。

实现高质量的equals方法的诀窍:

1、使用==操作符检查是否为这个对象的引用。

2、使用instanceof检查參数类型。
    在继承类或者接口调用时候,为了防止强制转换错误,常常会先用instanceof推断类型參数

3、把參数转换成正确的类型。由于前面作了instanceof測试,所以强制转换不会错误

4、对于该类中的关键域 ,检查參数中的域与该对象中对于域是否匹配。
        


覆盖equals时总是要覆盖hashCode

仅仅要对象的equals方法比較操作所用到的信息没被改动,那么对这个对象调用多次,hashCode
方法必须始终返回同一个整数。

假设两个对象依据equals方法比較是相等的,那么调用这两个对象调用hashCode必须是同一个值

假设两个对象的equals方法比較不相等,那么调用这两个对象hashCode不一定产生不同的整数。

相等的对象必须具有相等的散列码

public final class Phone{


   .....
    
    @Override 
    public boolean equals(Object  o){
        ....
    }
}

如果你企图将这个类与hashMap一起使用:
Map<Phnoe,String> map= new HashMap<Phnoe,String>();
    map.put(new Phone(),"lily");

这时候,你可能期望map.get(new Phone())会返回一个 “lily”,可是实际返回为null

注意:这里涉及两个Phone实例,第一个被插入到map集合中,第二个实例和第一个相等,被用于获取
,因为Phone类没有覆盖hashCode方法,从而导致两个相等的实例具有不同的散列码,违反了hashCode方法
约定。即put把一个Phone放入一个散列筒,可是get从还有一个散列筒中拿取,所以为null;
即便是正好从一个散列筒中操作,也会由于Hashmap'的优化,能够缓存相关联的的散列码。这样get得到的也是null。








【代码优化】equals深入理解的更多相关文章

  1. 对hashmap与hashcode()、equals()的理解

    1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会 ...

  2. HashCode和equals的理解

    -------------------------------------------------------------------------------------------第一篇博客---- ...

  3. 对hashcode、equals的理解

    1.首先hashcode和equals都是java每个对象都存在的方法,因为他们两是Object的方法. 2.hashcode方法默认返回的是该对象内存地址的哈希码,然而你会发现,Object类中没有 ...

  4. C# == equals 本质理解

    using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Co ...

  5. equals深入理解

    package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构 ...

  6. HashCode()与equals()深入理解

    1.hashCode()和equals()方法都是Object类提供的方法, hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的int型整数, Object的equa ...

  7. HashMap源码解读

    1.HashMap  1.6解读 a).put,get,遍历方式参看 http://www.cnblogs.com/skywang12345/p/3310835.html#a23 需要注意的是,1.7 ...

  8. .NET面试宝典-高级2

    http://blog.csdn.net/shanyongxu/article/category/6023593 对于 Web 性能优化,您有哪些了解和经验吗? 1.前端优化 (1)减少 HTTP 请 ...

  9. .NET高级软件工程师面试题排行榜(转载)

    原文引用:https://m.sanwen8.cn/p/104gMSd.html 一.对于 Web 性能优化,您有哪些了解和经验吗? 出现指数:五颗星 主要考点:这道题是博主在博客园的新闻里面看到的, ...

随机推荐

  1. 关于android应用闪屏的几种情况

    1.主菜单进入某应用闪屏: 常见是一个空的activity作为launcher属性,实际上它什么事业没干,真正干事情的是从它通过intent启动的activity. 例子: public class ...

  2. linux下系统定时任务配置----crontab(mysql定时备份)

    crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...

  3. 认识<hr>标签,添加水平横线

    在信息展示时,有时会需要加一些用于分隔的横线,这样会使文章看起来整齐些.如下图所示: 语法: html4.01版本 <hr> xhtml1.0版本 <hr /> 注意: 1.  ...

  4. Swift - 08 - 元组

    //: Playground - noun: a place where people can play import UIKit // 元组就是将多个不同的值集合成一个数据 /* 元组是Object ...

  5. 自由创造属于你的H5内容

    在这里,你可以自由创造属于你的H5内容  mark下 http://www.ih5.cn/

  6. 爬虫爬oj用户头像

    import requests import Queue import urllib import urllib2 import re import requests alreadyImg = set ...

  7. SGU 147.Black-white king

    时间限制:0.25s 空间限制:4M 题意: 在一个N*N(N <= 106)的棋盘上,有三个棋子:黑王.白王.黑白王,它们的行走方式一致,每秒向8个方向中的任意一个行走一步. 现在黑王和白王想 ...

  8. 【POJ1753】Flip Game

    [题目大意] 有一个4x4规格的一个棋盘,现在有16个一面黑一面白的棋子分布在这个棋盘上. 翻转一个棋子能够使它以及它上下左右的四个棋子从黑变白,从白变黑. 现在问你至少要经过多少次操作才能够使得整个 ...

  9. 关于jQuery表单校验的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. SOLID (面向对象设计) 基本原则

      SOLID (面向对象设计) 基本原则    在 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特•C•马丁在21世纪早期[1] 引入的记忆术首字母缩略 ...