【java】toString和equals

【java】toString和equals,第1张

 

 

/**
 * 关于Object类中的toString()方法:
 *      1、源码:
 *          public String toString(){
 *              return getClass().getName()+"@"+Integer.toHexString(hashCode());
 *          }
 *          源代码上toString()方法默认实现是:
 *              类名@对象的内存地址转换为十六进制的形式
 *      2、toString()方法可将一个"Java对象"转换成"字符串表示形式"
 *
 *      3、String类已经重写了equals方法和toString方法,比较两个字符串时直接使用equals和toString;
 *          如: String s1 = "hello";
 *              String s2 = "XD";
 *              System.out.println(s1.equals(s2)); //不能写成System.out.println(s1==s2)
 *                                                 //字符串不能使用"=="比较
 *             String s = new String("nihao");
 *             System.out.println(s);
 *      4、基本数据类型比较使用:"=="
 *         引用数据类型比较使用:"equals"
 *
 * Object类中的equals()方法:
 *      1、源码:
 *          public boolean equals(Object obj){
 *              return(this == obj);
 *          }
 *      2、equals方法的作用:判断两个Java对象(内容)是否相等(需要重写equals方法)
 *         没有重写:Time t1 = new Time(2022,1,1);
 *                 Time t2 = new Time(2022,1,1);
 *                 boolean f = t1.equals(t2);
 *                 System.out.println(f); //这里会输出false,因为equals默认方法中使用的是"=="
 *                                          而"=="比较的是对象的内存地址,t1和t2的内存地址不同。
 *                                         *所以使用equals方法时需要考虑比较的内容是否需要重写。
 *         "=="的作用:判断两个对象的内存地址
 *              如: int i=100;
 *                  int j=100;
 *                  System.out.println(i == j); //比较两个基本数据类型之间的值,这两个值内存地址相同
 *
 */

​​​​​​​

public class Test {
    public static void main(String[] args){
        Time time = new Time(2022,4,27);
        System.out.println(time.toString());  //这里可以直接写System.out.println(time);

        Time t1 = new Time(2022,1,1);
        Time t2 = new Time(2022,1,1);
        System.out.println(t1.equals(t2)); //输出true

        Time t3 = new Time(2022,1,3);
        System.out.println(t2.equals(t3));  //输出false
    }
}

class Time{
    int year;
    int month;
    int day;
    public Time(){}
    public Time(int year,int month,int day){
        this.year = year;
        this.month = month;
        this .day = day;
    }
    public String toString(){
        return year +"年"+month +"月"+ day +"日";
    }
/**    public boolean equals(Object obj){   //这样子重写效率低,看改良版
        //获取第一个日期的数据    t1.equals(t2)这里的t1是第一个数据,t2是第二个数据
        //                     t2第二个数据需要向下转型判断,t1t2对象名不是固定的
        //                      equals(obj)括号中的值为obj
        int year1 = this.year;
        int month1 = this.month;
        int day1 = this.day;

        //获取第二个日期的数据
        if(obj instanceof Time){
            Time t = (Time)obj;
            int year2 = t.year;
            int monthh2 = t.month;
            int day2 = t.day;
            if(year1 == year2 && month1 == monthh2 && day1 == day2){
                return true;
            }
        }
        return false;
    }
 */
//改良版
public boolean equals(Object obj){
    if(obj == null || !(obj instanceof Time)){//如果obj为空 或者 obj不是Time,直接返回false
        return false;
    }
    if(this == obj){
        return true;
    }
    Time t = (Time)obj;  //这里直接转型,因为前面已经判断过obj了
    return this.year == t.year && this.month == t.month && this.day == t.day; //&&为短路与,全相等输出true,反之输出false
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/866653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-12
下一篇 2022-05-12

发表评论

登录后才能评论

评论列表(0条)

保存