`
aihhd2008
  • 浏览: 25745 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java通用方法

    博客分类:
  • java
 
阅读更多
Object中的所有非final方法(equals 、hashCode、toString、clone 和 finalize )       目的是为了Override而设计的

Equals不需要重写的几种情况:
1     一个类的每个实例本质上都是惟一的。对于代表了活动实体而不是值(value)的类比如Thread。

2     不关心一个类是否提供了"逻辑相等(logical equality)"测试功能。例如java.util.Random改写equals方法,他检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户会需要这样的功能,在这样的情况下,从Object继承的equals实现已经足够了。

3      超类 已经改写了equals方法,从超类继承过来的子类也是合适的。例如大多数的Set从AbstractSet继承了equals实现,List实现从AbstractList继承了equals实现,Map实现从AbstractMap继承了equals实现

4      一个类是私有的,或者是包级私有的 ,并且可以确定他的equals方法永远不会被调用。
   
 public boolean  equals(Object o)  {
                throw new  UnsupportedOperationException();
    }

什么时候改写Object.equals?
当 一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念),而且超类也没有改写equals以实现期望的行为。
改写equals的目的:比较两个指向值对象的引用时候,希望知道他们逻辑上是否相等,而并不是他们是否指向同一对象。

重写equals方法的通用约定:
1 .  自反性   对于任意的引用值X,X.equals(X)一定为true
2.    对称性  对于任意的引用值X,Y 当且仅当Y.equals(X)返回true时,X.equals(Y)也一定返回true。
3.    传递性  对于任意的引用值X,Y,Z  如果X.equals(Y)返回true,并且Y.equals(Z)也返回true时,那么X.equals(Z)也一定要返回true
4.    一致性  对于任意的引用值X和Y,如果用于equals比较的对象信息没有被修改的话,那么,多次调用X.equals(Y)要么一致的返回true要么一致的返回false。
5.     对于任意的非空引用值X,X.equals(null)一定返回false

对称性:
例如:
              
Public   final class  CaseInsensitveString  {
                       private  final   String  s ;
                     public  CaseInsensitveString  (String  s){
                          if(s==null) throw new NullPointerException();
                          this.s=s;
                     }
                @override  public boolean equals(Object o) {
                       if(o instance of CaseInsensitveString )
                              return  s.equalsIgnore(((CaseInsensitveString)o).s);
                         if(o instanceof String)
                               return s.equalsIgnoreCase((String)o);
                             retrun false;
                }
             …
           }

假设一个不区分大小写的字符串和一个普通的字符串
CaseInsensitveString   cis =new CaseInsensitveString  ("Polish");
String p ="polish";
这时 cis.equals(p)返回true 但是在String类中equals却不知道区分大小写的字符串所以s.equals(p)却返回了false,违反了对称性。
所以可以重构上述方法为
           
  @override  public boolean equals(Object o) {
                     return o instanceof CaseInsensitveString  &&((CaseInsensitveString  )o).s.equalsIgnoreCase(s); 
             }


传递性:如果一个对象等于第二个对象,第二个对象等于第三个对象,那么第一个对象一定等于第三个对象。
在父类和子类的情况下,子类将一个新的值组件添加到父类中,子类添加的信息就会影响到equals的比较结果。
                   
    public  class Point() {
                            private    final    int x;
                            private    final    int y;
                            public Point(int x,int y) {
                                  this.x=x;
                                  this.y=y;
                            }
                       @override public boolean equals(Object o) {
                              if(!(o instanceof Point ))
                                       return false ;
                              Point p =(Point)o;
                         retrun p.x==x&&p.y==y;
                     }
                     …
                 }   
                public class ColorPoint extends Point {
                     private  final Color color ;
                 public ColorPonit(int x,int y,Color color) {
                    super(x,y);
                    this color =color;
               }
           ….
        }

在这段代码中equals比较的是Point而把点的颜色给忽略了。。。改为:
 
 @override public boolean equals(Object o) {
                              if(!(o instanceof ColorPoint ))
                                       return false ;
                            retrun super.equals(o)&&((ColorPoint)o).color==color;
                     }

这种情况下在比较有色点和普通点,在相反的情况下则返回false如:
Point   p= new Point(1,2);
ColorPoint cp =new ColorPoint(1,2,Color.red);
p.equals(cp)
返回true  cp.equals(p)返回false 违反了对称性

 
 @override public boolean equals(Object o) {
                              if(!(o instanceof  Point ))
                                       return false ;
                             if(!(o instanceof ColorPoint))
                                     return o.equals(this);
                            retrun super.equals(o)&&((ColorPoint)o).color==color;
                     }

Point   p1= new Point(1,2);
ColorPoint p2 =new ColorPoint(1,2,Color.red);
ColorPoint p3 =new ColorPoint(1,2,Color.blue);
P1.equals(p2); true
P1.equals(p3);true;
P2.equals(p3);false;

违反了传递性。
解决办法:在一个抽象的(abstract)类的子类中增加新的值组件
一个抽象的Shape类,他没有任何值组件,Circle子类增加了一个radius域,Rectangle子类增加了length和width域,只要不直接创建父类的实例,就可以使用equals进行子类中实例的比较。

一致性:如果两个对象相等,他们就必须始终保持相等,除非他们中有一个或者俩个都被修改了。当你在写一个类的时候考虑这个类是否是不可变的,如果他是不可变的,就必须保证equals方法满足相等的对象要永远相等,不相等的永远不相等。
非空性:所有的对象都必须不等于null,equals方法必须使用instanceof操作符,检查其参数是否为的正确的类型:
                 
  @override public boolean equals (Object o) {
                             if(!(o instanceof MyType))
                                           return false; 
                              MyType mt =(MyType) o ;
                           …
                        }

总结实现equals方法:
1.使用“==”操作符检查“参数是否为这个对象的引用”。如果是,则返回true
2.使用instanceof操作符检查“参数是否为正确的类型”。如果不是则返回false
3.把参数转成正确的类型。
4.对于该类中的每个“关键域”,检查参数中是否与该对象中对应的域相匹配。
注意:不要将equals声明中的Object对象替换为其他的类型
Public boolean equals(MyClass  o) {
...
} 这个方法并没有重写Object.equals.因为他的参数应该是Object类型的,相反他重载了Object.equals。































分享到:
评论

相关推荐

    java 通用http发送方法 java 通用http发送方法

    java 通用http发送方法 java 通用http发送方法java 通用http发送方法 java 通用http发送方法java 通用http发送方法 java 通用http发送方法java 通用http发送方法 java 通用http发送方法java 通用http发送方法 java ...

    java和C#通用des3加解密

    标题中的“java和C#通用des3加解密”指的是在Java和C#这两种不同的编程语言中实现DES(Data Encryption Standard)的加强版——3DES(Triple DES)加解密算法。3DES是一种广泛使用的对称加密算法,通过三次应用DES的...

    java 通用http发送方法 java 通用http发送方法java 通用http发送方法

    java 通用http发送方法 java 通用http发送方法java 通用http发送方法java 通用http发送方法 java 通用http发送方法java 通用http发送方法java 通用http发送方法 java 通用http发送方法java 通用http发送方法java ...

    java 通用http工具封装 java 通用http工具封装java 通用http工具封装java 通用http工具封装

    java 通用http工具封装 java 通用http工具封装java 通用http工具封装java 通用http工具封装java 通用http工具封装 java 通用http工具封装java 通用http工具封装java 通用http工具封装java 通用http工具封装 java ...

    java 通用http工具封装 java 通用http工具封装

    java 通用http工具封装 java 通用http工具封装java 通用http工具封装 java 通用http工具封装java 通用http工具封装 java 通用http工具封装java 通用http工具封装 java 通用http工具封装java 通用http工具封装 java ...

    java 通用分页 java 通用分页

    下面对Java通用分页的知识点进行详细说明: 1. 分页的必要性 在实际项目中,数据量可能非常大,直接查询所有数据将会导致系统性能下降。如果不进行分页处理,系统将需要加载所有数据,导致系统效率下降,甚至出现...

    java8 通用转echart方法

    本篇文章将深入探讨如何在Java 8中创建一个通用的方法来转换数据并为ECharts准备合适的JSON格式。 首先,我们要理解ECharts图表需要的数据格式。ECharts图表通常需要两类数据:系列(series)和类别(categories)...

    java 操作文件通用方法集合

    ### Java操作文件通用方法集合详解 在Java编程中,对文件进行操作是常见的需求,包括读取、写入、创建、删除以及获取文件属性等。本文将深入解析一个名为`FileUtils`的类,该类封装了一系列用于文件操作的通用方法...

    java执行SQL语句实现查询的通用方法详解

    "java执行SQL语句实现查询的通用方法详解" 本文主要介绍了java执行SQL语句实现查询的通用方法详解,具有一定借鉴价值,需要的朋友可以参考下。 一、Java执行SQL语句实现查询的通用方法详解 在Java中执行SQL语句...

    java 通用比较类

    本文将深入探讨Java中通用比较类的概念、实现方式以及它们在实际编程中的应用。 1. **比较器接口(Comparator)** Java中的`Comparator`接口位于`java.util`包下,它定义了一个`compare()`方法,用于比较两个对象...

    JAVA中excel导入导出通用方法

    JAVA中excel导入导出通用方法 JAVA 中 excel 导入导出通用方法是指在 Java 项目中实现 excel 文件的导入和导出功能。这种方法可以应用于各种需要 excel 文件交互的业务场景中。 一、引入依赖 在 Java 项目中想要...

    JAVA链接数据库的通用方法类

    这个名为"JAVA链接数据库的通用方法类"的资源提供了一个通用的Java类,可以帮助开发者便捷地与各种数据库系统(如MySQL、Oracle等)建立连接。下面我们将深入探讨这个主题,了解如何在Java中实现数据库连接以及通用...

    Java通用范例开发金典源代码

    《Java通用范例开发金典源代码》是一个包含大量Java编程示例的资源集合,旨在帮助开发者深入理解和掌握Java编程语言的各种特性和应用场景。这个压缩包文件中的源代码覆盖了Java语言的基础到高级各个方面,是Java学习...

    Java通用范例开发金典

    《Java通用范例开发金典》是一本专为Java开发者准备的实践指南,它涵盖了大量Java编程中的常见问题和解决方案,旨在帮助读者更好地理解和应用Java语言。这份资源包含可直接运行的源码,使得学习过程更为直观和高效。...

    Java通用restful返回工具类

    通用restful返回工具类

    uc9.0java通用版

    uc9.0java通用版【界面优化】界面和设置项的样式和布局调整,优化视觉效果,提升操作体验 【功能优化】支持自定义背景色、快捷键,优化翻页、自由复制等功能 【无痕浏览】开启无痕浏览模式后,将不记录网址输入、...

    JAVA下载通用版

    JAVA下载通用版

    java一个通用的分页方法

    ### Java通用分页方法解析与应用 在Java开发中,特别是在Web应用中,分页功能是数据展示中不可或缺的一部分。合理的分页不仅能够提升用户体验,还能优化服务器性能,避免一次性加载大量数据导致的延迟和资源消耗。...

    java通用的调用webservice

    java通用的调用webservicejava通用的调用webservice

    《Java通用范例开发金典》

    《Java通用范例开发金典》是一本专为Java开发者准备的实践指南,它涵盖了Java编程的多个核心领域,旨在帮助读者深入理解并熟练运用Java语言进行软件开发。该书的源代码是学习和参考的重要资源,能为初学者提供实际...

Global site tag (gtag.js) - Google Analytics