覆盖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. 第一章 Javascript基础

    一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAscipt. d.特 ...

  2. 想追赶.Net的脚步?Java面前障碍重重

    待到Java 8面世之时 .Net的进度时钟恐怕已经又走过了两到五年——届时微软做出的调整将使二者差距进一步拉大. 就在几周之前,我详细介绍了Java 8中值得期待的几大主要功能.不过当时我并没有提到 ...

  3. java web 学习(1)

    java web 应用的核心技术包括以下几个方面: jsp:进行输入和输出的基本手段 javabean:完成功能的处理 servlet:对应用的流程进行控制 jdbc:是与数据库进行交互不可缺少的技术 ...

  4. VISUAL STUDIO 2005连接MYSQL数据库

    // mysql.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include &l ...

  5. MLlib 编程指导-spark-1.2.0

    本文来自 http://spark.apache.org/docs/latest/mllib-guide.html 官方文档翻译 个人翻译 MLlib包括的算法和工具主要有:分类,回归,聚类,协同过滤 ...

  6. hdu 4548 第六周H题(美素数)

    第六周H题 - 数论,晒素数 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   De ...

  7. gets与scanf

    gets与scanf 从功能上可以看出不同之处:1 终止条件不同: gets只有遇到\n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入.比如输入"test string\n&q ...

  8. PHP之路——MySql基础操作语句

    1,创建数据库,create datebase 数据库名,在这里kenan建立一个数据库名为myfirstdb create database myfirstdb; 2,查看所有的数据库 show d ...

  9. IDF 实验室部分题目WriteUp

    前天花了一个下午的时间刷了几道IDF实验室的题目, 这个网站实在是有点冷清, 题目也比较少, 所以就被我和师兄们刷榜了2333... 因为我最先开始做, 所以就干脆刷到第一去了. 题目很水, 切莫见怪 ...

  10. Solr4.8.0源码分析(9)之Lucene的索引文件(2)

    Solr4.8.0源码分析(9)之Lucene的索引文件(2) 一. Segments_N文件 一个索引对应一个目录,索引文件都存放在目录里面.Solr的索引文件存放在Solr/Home下的core/ ...