热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EffectiveJava2对于所有对象都通用的方法

尽管Object是一个具体类,但是设计它主要是为了扩展, 它的所有非final方法都有明确的通用规定; 本节主要讲Object类的非final方法 & Comparable.compareTo()

尽管Object是一个具体类,但是设计它主要是为了扩展, 它的所有非final方法都有明确的通用规定;

本节主要讲Object类的非final方法 & Comparable.compareTo()方法;

覆盖equals时请遵守通用约定:

1. equals通用约定:

– equals方法实现了等价关系

– 自反性:对于任何非null的引用值x,x.equals(x)必须返回true

– 对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true

– 传递性:对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,则x.equals(z)也必须返回true

– 一致性:对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,则多次调用x.equals(y)的返回结果是一致的

2. 不需要覆盖equals对情况:

– 类对每个实例本质上都是唯一的,例如Thread,每个实例都对应一个线程;

– 不关心类是否提供了”逻辑相等”的测试功能:如Random可以覆盖equals检查两个实例是否产生相同的随机数序列,但设计者并不认为用户需要或期望这样的功能,所以并没有重写equals方法; 

– 超类已经覆盖类equals,且对于子类也适用时; 

– 类是私有的或是包级私有的,可以确定他的equals方法永远不会被调用,此时最好覆盖equals方法,防止被意外调用;

EffectiveJava-2-对于所有对象都通用的方法

3. 需要覆盖equals的情况:

“值等”情形:类具有自己特有的”逻辑相等”概念,而且超类还没有覆盖equals以实现期望的行为;

4. 注意equals方法的写法:

不要将equals声明中的Object对象替换成其他的类型,这可能带来不可预知的麻烦;

EffectiveJava-2-对于所有对象都通用的方法

覆盖equals时总要覆盖hashCode

1. hashCode通用约定:

– 在程序执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么同一个对象调用多次,hashCode方法都必须始终如一的返回同一个整数,同一个应用程序的多次执行过程中,返回的整数可以不一致; 

– 如果两个对象使用equals比较是相等的,那么hashCode必须产生同样的整数结果; 

– 如果两个对象使用equals比较是不相等的,那么hashCode方法不一定要产生不同的整数结果,但是,程序员应该知道,给不想等的对象产生不同的hashCode可能提高散列表的性能;

2. 为不相等的对象产生不相等的散列码(hashCode方法的返回值):

– 将某个非零常数值赋值给result,如result=17

– 为每个关键域f(指equals涉及的域)计算散列码,并合并到result中

计算:

EffectiveJava-2-对于所有对象都通用的方法

合并,公式:result=31*result+c;

– 返回result

可以把冗余域(可以根据其他关键域计算出来)排除;

必须把equals中没有用到的域排除;

EffectiveJava-2-对于所有对象都通用的方法

始终覆盖toString

通用约定:

– 建议所有子类都覆盖这个方法, 返回对象中包含的所有值得关注的信息;

– 提供好的toString实现可以使类用起来更加舒适;

谨慎的覆盖clone

– implements Cloneable, 重写clone方法;

– 注意不能伤害到原始对象,并确保正确到创建被克隆对象中到约束条件;

– 可能有必要从某些域中去掉final修饰符;

EffectiveJava-2-对于所有对象都通用的方法

– 一些专家级到程序员干脆从来不去覆盖clone方法,也从来不去调用它,除非拷贝数组;

– 对于一个为了继承而设计的类,如果你未能提供行为良好的受保护的clone方法,它的子类就不可能实现Cloneable接口;

考虑实现Comparable接口

遵守自反性,对称性,传递性

EffectiveJava-2-对于所有对象都通用的方法

注意: 

如果想给一个实现了Comparable接口的类增加值组件,请不要扩展这个类,

要编写一个不相关的类,其中包含第一个类的一个实例,并提供一个视图(view)方法返回这个实例,这样既可以在第二个类上自由的实现compareTo方法,也允许客户端在必要的时候,将第二个类的实例视同第一个类的实例;

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章


推荐阅读
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
没什么65丶1_750
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有