0
点赞
收藏
分享

微信扫一扫

Java开发——17. equals和== 的区别

飞空之羽 2022-04-29 阅读 58
java

​总结:

类型不同 对象不同 运行速度不同

一:类型不同

equals():是Object中声明的方法;

==:是比较元素符。

二:比较对象不同

equals():在Object底层仍是使用来判断传入对象是否相同;如果没有对equals进行重写,equals和实现的效果是相同的。
如果该对象没有重写equals方法,则比较的是地址值,如果重写了,就按重写的规则来比较两个对象,会比较类中的相应属性是否都相等;重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。

//object中定义的equal方法
public boolean equals(Object obj) {
    return (this == obj);
}

//可见,底层仍然是使用 == 来判断,当前内容和传入对象是否相同

在不同的类中重写的equals方法不同,所以要理解本质,并不是所有的equals方法都是比较地址的。重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。

 //String类中重写的equals方法
 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
//instanceof :是多态中的关键字,用来判断anObject 是否是 String数据类型。
        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;
    }

equals 和 == 的区别:

equals:

      String str = "小红";
        String st2 = "小红";//这里比较的是字符串的值,可以对照String类中重写的equals方法
        boolean equals1 = str.equals(st2);
        System.out.println(equals1); //true
        
        String str2[] = {"1","2","3","4"};
        String str3[] = {"1","2","3","4"};//这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值
        boolean bl = str2 == str3;
        System.out.println(bl);  //false
        
//比较的就是地址值是否相同
         boolean equals = str.equals(str3);
         System.out.println(equals);//false

==:

    针对基本数据类型:比较的就是值;

    针对引用数据类型:比较的就是内存地址;
     String str = "小红";String str2[] = {"1","2","3","4"};
        String str3[] = {"1","2","3","4"};//这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值
        boolean bl = str2 == str3;
        System.out.println(bl);  //false//这里是把获取到的str2[1]的值,和str字符串进行比较;
//所以这里比较的是在常量池中的字符串和在堆内存中存储的str2的值进行比较
        boolean bl1 = str == str2[1];
        System.out.println(bl1); //false//这里比较的是基本数据类型的值,只要定义的值相同,都会返回TRUE。
        int num = 5;
        double num2 = 5;boolean bl2 = num == num2;
        System.out.println(bl2); //true

三:运行速度不同

equals():没有==运行速度快。
举报

相关推荐

0 条评论