equals 与 == 的区别

首先Java中的数据类型有两种:

1.基本数据类型(也称原始数据类型)

   基本数据类型有 byte short int long char float double boolean

   这些都是用 == 来比较两者的值是否相等,不具有equals方法

package code;

public class Test1 {

	public static void main(String[] args) {
		
		int a = 3;
		int b = 3;
		float c = 5.0f;
		float d = 5.0f;
		
		System.out.println(a == b);  //true
		System.out.println(c == d);  //true
		//基本数据类型,使用 == 判断值是否相等,不具有equals方法	
	}

}
2.引用数据类型(也称复合数据类型)

    除了基本数据类型外,Java还有复合数据类型,如类(class),接口(interface),数组(array)等。

    复合数据类型是变量和函数的封装。

    对于复合数据类型,“==”比较的是对象的内存地址,相同返回true,不同返回false;

    一般的来说,equals 和“==”一样,都是比较对象的内存地址,相同返回true,不同返回false。(因为一般情况下对象的equals方法都是继承父类Object,而Object中的equals方法使用的就是“==”,下面是Object类中equals的功能实现源码)

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

    然而,Object的子类可以重写equals方法,此时equals与“==”就不一样了!比如Data,String,Integer等类都是重写equals方法,比较的是值是否相等。例如String类的源码

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;
    }

先比较内存地址是否相同,相同返回true,内存地址不相同的时候再比较值是否相等,值相等,则返回true,值不等返回false。

下面举个例子

package code;

public class Test {
	
	public static void main(String[] args){
		String str1 = "abc";
		String str2 = "abc";
		String str3 = new String("abc");
		
		System.out.println(str1 == str2);  		//true 
		System.out.println(str1 == str3);		//false
		System.out.println(str1.equals(str2));	        //true
		System.out.println(str1.equals(str3));	        //true
	} 
}

    str1 == str2 为true,是因为 再JVM执行“String str1 = “abc””这行代码时,会检查常量池中是否存在“abc”这个字符串,如果存在,则返回这个字符串的引用;如果不存在,则将这个字符串添加到池中,然后返回这个字符串的引用。在JVM执行“String str2 = "abc" ”时,也会检查常量池中是否存在“abc”这个字符串,由于前一行的代码已经将“abc”添加到池中了,所以此时,返回的是已存在的“abc”的引用,所以str1与str2的引用相同,即str1与str2内存地址相同,“==”判断返回true;

    str1 == str3为false,是因为通过new 出来的对象会放在堆(Heap)中,而不是在常量池,所以str1与str3的内存地址不同,“==”判断返回false;

    str1.equals(str2)为true,是因为String类中重写了equals方法,先判断内存地址,再判断值。equals在判断内存地址的时候,由于str1 与str2 内存地址相同,所以返回true;

     str1.equals(str3)为true,是因为虽然str1与str3的内存地址不同,但是String类中重写的equals方法会在判断内存地址不同之后会再进一步判断值是否相同,而str1与str3的值相同,所以返回true;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值