覆盖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. 该项目中不存在目标 precomputecompiletypescript The target "PreComputeCompileTypeScript" does not exist in the project

    Open Microsoft.TypeScript.targets file located under C:\Program Files (x86)\MSBuild\Microsoft\Visual ...

  2. UITabBarController自定义一

    UITabBarController自定义一 首先在Appdelegate.m文件中将UITabBarController的子类设置为rootViewController,并设置其viewContro ...

  3. iOS App完整项目

    前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 完整项目 Phonetic Swift 写的 ...

  4. shareSDK微博分享出现: 分享失败: 错误描述:Insufficient app permissions! 错误码:10014

    这个错误是由于appKey所在账号没有微博高级写入接口权限, 需要申请, 详见: http://www.mamicode.com/info-detail-936938.html

  5. Ajax的工作流程简述

    提到Ajax相信我们都不会陌生,不管你是前端开发还是后台数据处理的程序员,ajax的作用就像现在生活中的手机一样,无论是作用还是流程都差不多,这里我们要进行ajax操作后台数据并显示在页面上的话,首先 ...

  6. JFrome 登陆/注册/回显无数据库连接小程序

    当离开RCP插件区重新回顾一下JFrame窗口程序的标签.页面间的跳转. 完成一个登陆.注册界面.(界面完成后练习输入输出流,将前台的注册信息保存到一个文件夹下的.txt文件中) 首先向通过JFram ...

  7. 【USACO 2.1.2】法雷序列

    [问题描述]     对任意给定的一个自然数 n(n<=160), 将分母小于等于 n 的不可约的真分数按上升的次序排序 , 并且在第一个分数前加上 0/1, 而在最后一个分数后加上 1/1, ...

  8. 完全用 GNU/Linux 工作(转)

    转自:http://www.chinaunix.net/old_jh/4/16102.html 看到一半,实在太长,但已觉得很好,转来分享一下. 完全用 GNU/Linux 工作 - 摈弃 Windo ...

  9. underscorejs-invoke学习

    2.13 invoke 2.13.1 语法: _.invoke(list, method, *args) 2.13.2 说明: 每个list属性值都执行method方法,根据method方法返回一个数 ...

  10. 『Python』 多线程 端口扫描器

    0x 00 Before Coding 当端口打开时,向端口发送 TCP SYN 请求,会返回一个 ACK 响应: 当端口关闭,返回的是 RST 响应: 0x 01 Coding  可以用 socke ...