zoukankan      html  css  js  c++  java
  • equals和toString方法

    Object类中含有equals和toString方法,先看下equals方法:

     public boolean equals(Object obj) {
            return (this == obj);
        }

    可以看出,它比较的时两个对象的地址。因此,需要达到预期的效果,必须重写equals方法。

    重写equals方法:

     public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Parcel11 parcel11 = (Parcel11) o;
            return age == parcel11.age &&
                    height == parcel11.height &&
                    Objects.equals(name, parcel11.name);
        }

    toString方法:

     public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }

    默认为类名加16进制hash码。

    因此需要使用的时候也需要进行重写。注意当输出对象时,默认会调用toString方法。

    为何?

    先看下println函数源码:

     public void println(String x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }
    public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }

    可以看到,当输入是一个object对象时,会调用String类的valueOf方法将其转为一个字符串,valueOf方法源码如下:

    public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }

    可以看到,如果obj不为空时,会调用toString方法。在String类中,已经重写了equals方法和toString方法。

    源码如下:

    重写的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;
        }

    重写的toSring方法:

    public String toString() {
            return this;
        }

    因此,在进行比较时,就需要小心了,当比较引用类型变量(包括字符串)时,一般用equals方法,当比较基本类型时,使用“==”。

  • 相关阅读:
    Flink 源码解析 —— 深度解析 Flink 序列化机制
    Flink Metrics 源码解析
    Flink 源码解析 —— JobManager 处理 SubmitJob 的过程
    vue封装插件并发布到npm上
    vue+ivew-admin开发项目,内存占用过大解决办法
    Vue-cli 2.9 多页配置及多页面之间的跳转问题
    vuex2.0 基本使用(3) --- getter
    vuex2.0 基本使用(2) --- mutation 和 action
    vuex2.0 基本使用(1) --- state
    如何新建仓并 上传本地新的项目
  • 原文地址:https://www.cnblogs.com/xuhan74520/p/13885309.html
Copyright © 2011-2022 走看看