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

【总结】Effectivejava经验之谈,通用方法

转载请注明出处:http:blog.csdn.netsupera_liarticledetails45034203Effectivejava系列1.Effectivejav

转载请注明出处:http://blog.csdn.net/supera_li/article/details/45034203 

Effective java系列
1.Effective java经验之谈,创建和销毁对象
2.Effective java经验之谈,泛型
3.Effective java经验之谈,类与接口
4.Effective java经验之谈,通用方法
5.Effective java经验之谈,枚举,注解,方法,通用设计,异常
6.Effective java经验之谈,并发编程

       对于通用方法,其实应用的场景是比较多的,我们在写一个类的时候,就要考虑是否要编写该方法的通用方法。这使得我们为以后该类的扩展性与使用方面提供很大的便利。

1.      覆盖equals时请遵守通用约定。自反性,对称性,传递性,一致性,非空性。编写子类equals的方法的时候,可以考虑是否可以用复合,不使用继承来解决问题。Instanceof进行参数检测,如果参数null,也将返回false。

2.      覆盖equals时总要覆盖hashCode。

       1.对象属性不变化,返回的hashcode永远相等。

       2.如果对象通过equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode产生同样的结果

       3.对象的equals方法比较不相等,这两个对象任意的hashcode不一样

       设计equals()

       [1]使用instanceof操作符检查“实参是否为正确的类型”。

       [2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。

       [2.1]对于非float和double类型的原语类型域,使用==比较;

       [2.2]对于对象引用域,递归调用equals方法;

       [2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;

       [2.4]对于double域,使用Double.doubleToLongBits(adouble)转换为int,再使用==比较;

       [2.5]对于数组域,调用Arrays.equals方法。

      设计hashCode()

      [1]把某个非零常数值,例如17,保存在int变量result中;

      [2]对于对象中每一个关键域f(指equals方法中考虑的每一个域):

      [2.1]boolean型,计算(f ? 0 : 1);

      [2.2]byte,char,short型,计算(int);

      [2.3]long型,计算(int) (f ^ (f>>>32));

      [2.4]float型,计算Float.floatToIntBits(afloat);

      [2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再[2.3];

      [2.6]对象引用,递归调用它的hashCode方法;

      [2.7]数组域,对其中每个元素调用它的hashCode方法。

      [3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;

      [4]返回result。

 3.始终要覆盖toString方法。只有覆盖这个方法,其他例如Arrays.toString(),以及集合类的toString。当你某一个调用该类输出的时候,就会调用该类已经实现的toString。

4.谨慎的调用clone方法。当你为一个继承而设计的类的时候,如果无法提供安全受保护的clone,那么子类就不可能实现Cloneable,因为子类实现需要调用父类的clone。Clone方法中对可变引用对象的copy可以通过递归clone完成。总结来说,对于clone不直接使用,而采用拷贝构造器以及拷贝工厂的方案来代替他。即入参和返回都是同类。

5.考虑实现Comparable接口。对于该接口的约定参考着equals。该接口指出了实现类的内在排序,实现该接口的类,可以参与排序算法[Collections.sort()等]。可以利用该接口的约定简略代码,返回值正负与0,并不关心值是多少。


像博主这么逗比的人还有吗?委屈(卖萌吗?)



推荐阅读
  • 1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回& ... [详细]
  • 本文来自:高爽|Coder,原文地址:http:blog.csdn.netghsauarticledetails16843543,转载请注明。HashMap可以 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 你知道一个对象的唯一标志不能仅仅通过写一个漂亮的equals来实现太棒了,不过现在你也必须实现hashCode方法。让我们看看为什么和怎么做才是正确的。相等和哈希码相等是从一般的方面 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • -------------------------------------------------android培训、java培训期待与您交流!--------------------------- ... [详细]
  • Java集合类中常见的hashSet,hashMap,hashTable(现已很少用,几乎都采用hashMap替代)的实现都离不开散列表,而散列表的优势在于O(1)级别的查找,而has ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • java散列与散列码探讨,简单HashMap实现散列映射表执行各种操作示列packageorg.rui.collection2.maps;***散列与散列码*将土拔鼠对象与预报对象联系 ... [详细]
  • 本文版权归远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。在JavaAPI文档中关于hashCode方法有以下几点规定(原文来自java深入解析一书) ... [详细]
  • 如何解决《为什么这个hashCode()方法被认为很差?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《JavaHashSet包含无法正常工作的函数》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《hashCode()返回负值的字符串》经验,为你挑选了1个好方法。 ... [详细]
author-avatar
手机用户2502939177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有