JavaSE基础——==和equals的区别

JavaSE基础——==和equals的区别,第1张

JavaSE基础——==和equals的区别

        ==是一个比较运算符

  1. ==:既可以判断基本类型,又可以判断引用类型。
  2. ==:如果判断基本类型,判断的是值是否相等。
  3. ==:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一对象。
  4. equals:是object类中的方法,只能判断引用类型。
  5. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。(具体可查看jdk源码)。
名称概念基本类型引用类型==比较运算符可以,判断的是值是否相等可以,判断是不是同一对象equals

是object类中的方法

java类都可以使用

不可以

可以,默认判断的是地址是否

相等,子类中往往重写该方法,

用于判断内容是否相等。

//JDK源码Object类中的equals方法
//Object类中的equals方法默认就是比较对象地址是否相同,也就是判断两个对象是否是同一对象。
public boolean equals(Object obj) {
        return (this == obj);//此时的==就是在判断引用类型,判断地址是否相等。
    }


//JDK源码String类的equals方法
//String是object的子类,将equals方法重写,变成了比较两个字符串是否相同
public boolean equals(Object anObject) {
        if (this == anObject) {//如果是同一个对象
            return true;//返回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;//如果两个字符串的所有字符都相等,返回true
            }
        }
        return false;//如果比较的不是字符串,直接返回false;
    }


//JDK源码Integer类也重写了Object的equals方法
public boolean equals(Object obj) {
        if (obj instanceof Integer) {//判断类型
            return value == ((Integer)obj).intValue();//判断两个值是否相等。
        }
        return false;
    }
package com.study.srv.demo4;


public class Demo01 {
    public static void main(String[] args) {
        N a = new N();
        N b=a;
        N c=b;
        System.out.println(a==c);//true,比较引用类型,同对象
        System.out.println(b==c);//true,比较引用类型,同对象
        M d=a;
        System.out.println(d==c);//true,比较引用类型,同对象
        int num1=10;
        double num2=10.0;
        System.out.println(num1==num2);//true,基本数据类型,判断值是否相等
        //
        String str1 = new String("jack");//String类
        String str2 = new String("jack");
        System.out.println(str1==str2);//此时是判断是否是同一对象,false。
        System.out.println(str1.equals(str2));//判断比较字符串是否相等,true。
        Integer int1 = new Integer(100);//Integer类
        Integer int2 = new Integer(100);
        System.out.println(int1==int2);//此时是判断是否是同一对象,false。
        System.out.println(int1.equals(int2));//判断两值是否相等,true。
    }
}
class M{}
class N extends M{}

package com.study.srv.demo4;


public class Demo01 {
    public static void main(String[] args) {
        M m1 = new M();
        m1.name="jack";
        M m2 = new M();
        m2.name="jack";
        System.out.println(m1==m2);//此时的==是判断的是引用类型,判断的是地址是否相等。所以false
        System.out.println(m1.equals(m2));//此时的equals调的是Object类的equals方法,值判断是否是同一对象,所以false
        System.out.println(m1.name.equals(m2.name));
        //此时的equals因为name属性是String类型,所以调的是String类中的equals方法,
        // 先判断是否是同一对象,如不是在判断字符串的值是否相等,所以true。
    }
}
class M{
    public String name;
}

 

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

原文地址: https://outofmemory.cn/zaji/5676568.html

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

发表评论

登录后才能评论

评论列表(0条)

保存