zoukankan      html  css  js  c++  java
  • 重写java对象中的equals方法(这次我们只比较内容,不比较引用即内存地址)

    要想判断两个对象是否相等,不能通过比较两个对象的引用是否相等(即==),这是永远都得不到相等的结果的,因为两个对象的内存地址永远不会相等,所以正确的比较方法是直接比较这两个对像里面的内容是不是相同的。

    Object类提供了一个equals()方法来比较两个对象的内容是否相同,因此我们可以采用这个方法去比较两个对象是否在逻辑上“相等”。如:c1.equals(c2);这里是调用从Object类继承下来的equals()方法,通过查阅API文档得到Object类里的equals方法的定义如下:

    public boolean equals(Object obj)

      在Object这个类里面提供的Equals()方法默认的实现是比较当前对象的引用和你要比较的那个引用它们指向的是否是同一个对象,即和“c1==c2”这种写法是一样的,“c1.equals(c2)”与“c1==c2”是完全等价的。因此直接使用继承下来的equals()方法也是无法直接比较两个对象的内容是否相同的,为此,我们必须得重写equals()方法,改变这个方法默认的实现。

     通过比较两个对象中的属性值是否相同,来判断Java对象是否相同。这里通过Object对象是所有类的父类,来实现复用。注意:这里不能比较属性是自定义实体类(javabean).

    自定义实体类equals依然从object中继承来。大家可以通过递归,自行实现这种比较。而基本类型的包装类及String中的equals()都是重写过的,后面我们会给出String的源码并解析.

    @Override
    public boolean equals(Object obj) {
    if (obj != null ) {
    Object other = (Object) obj;

    //获取当前类中所有定义的属性
    Field[] property1 = getClass().getDeclaredFields();
    Field[] property2 = other.getClass().getDeclaredFields();
    if (property1.length == property2.length) {
    for (int i = 0; i < property2.length; i++) {
    try {
    Field filed1 = property1[i];
    Field filed2 = property2[i];

    //设置当前属性可以访问(默认private是不可以访问的)
    filed1.setccessible(true);
    filed2.setAccessible(true);

    //获得当前属性的值
    Object value1 = filed1.get(this);
    Object value2 = filed2.get(obj);
    System.out.println(value1);
    if (!value1.equals(value2))
    return false;
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    }
    return true;
    } else
    return false;
    }
    return false;
    }

    字符串中equals解析

    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String) anObject;
    int n = value.length;
    if (n == anotherString.value.length) {

    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {

    //通过比较单个字符中的字符来判断字符串值是否相等
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }

     

     

     

  • 相关阅读:
    HDOJ-3635-Dragon Balls 解题报告
    HDOJ-1217-Arbitrage 解题报告
    C语言控制台窗口图形界面编程(总结)
    PC(win10)上搭建 kubernetes + docker 集群环境
    Hessian 2.0 序列化协议
    对响应式布局的理解
    常用链接集合
    dubbox升级dubbo的过渡方案:通过扩展dubbo的Protocol实现dubbo与dubbox的相互调用
    Wordpress部署 —— 基于Ubuntu、Mysql和Nginx
    关于27种常见设计模式的总结
  • 原文地址:https://www.cnblogs.com/caibixiang123/p/8317460.html
Copyright © 2011-2022 走看看