"=="和"equals()"的作用及区别

"=="的作用是比较两个变量是否相等。

  • 当变量是基本数据类型时,比较的是值是否相等的:相等返回true,不等返回false:
		double a = 100.0;
		int b = 100;
		System.out.println(a==b);
									//输出结果为:
									true
  • 当变量是引用类型时,比较的是地址:地址一样返回true,地址不同则返回false:
		String str1 = "apple";
		String str2 = "apple";
		System.out.println(str1==str2);	
									//输出结果为:
									true
		String str3 = new String("lemo");
		String str4 = new String("lemo");
		System.out.println(str3==str4);
									//输出结果为:
									false	

"equals()"既可以用于判断 Number 对象与方法的参数进是否相等,也可以用于字符串与指定的对象比较。

  • 当变量是Number时(且不为null)参数类型数值都相等时返回true,否则返回false(Double 和 Float 对象还有一些额外的条件):
		Integer x = 10;
		Integer y = 5;
		Integer z = 10;
		Short m =  10;
		System.out.println(x.equals(y));
		System.out.println(x.equals(z));
		System.out.println(x.equals(m));
								//输出结果为:
									false
									true
									false

  • 当变量为String类时:先比较地址,再比较每个字符,当地址相同时即刻返回true,不用再比较每个字符;当地址不同时,再比较对应字符,相同时也返回true,不同则返回false:
		String name1="Tim";
		String name2="Tim";
		System.out.println(name1.equals(name2));
		
		Test test = new Test();
		System.out.println(name1.equals(test));
		
		String name3=new String ("Tom");
		System.out.println(name1.equals(name3));
										//输出的结果为:
										true
										false
										false

让我们结合equals的源代码来了解一下其中的原理:

public boolean equals(Object anObject) {		
        if (this == anObject) {						//此处比较两个变量的地址,this指代调用的是equals()方法对象的地址(此处即为name1的地址),
        	return true;							//anObject存的是上转型对象的地址(即name2的地址),
        }         									//因为name1和name2的地址一样,所以返回true
        if (anObject instanceof String) {			//此处判anObject变量所指向的对象是否为String类型,因为test不是String类,所以直接执行最后一行代码,即返回false
            String anotherString = (String)anObject;//此处将上转型对象直接下转型(上转型对象不能直接调用子类新增的方法,因为Object类中没有下面要用的value.length方法,所以要下转型)
            int n = value.length;					//计算出调用equals()方法的String对象的每个字符组成的char类型数组的长度(即name1的长度)
            if (n == anotherString.value.length) {	//比较两个对象的char类型数组的长度
                char v1[] = value;				   	//name1的char类型数组
                char v2[] = anotherString.value;	//anObject所对应的字符串的字符构成的char类型数组(即name3的char类型数组)
                int i = 0;
                while (n-- != 0) {					//对每个字符进行比较
                    if (v1[i] != v2[i])				//若有对应字符不相同,则返回false
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

总结一下,

  • 当变量是数字时,==仅比较数值,相同就true不同就false,但equals()除了比较数值以外,还要比较类型,两者都想同时返回true,否则返回false;
  • 当变量是字符串时, ==仅比较地址,地址相同返回true,不同返回false,(不管对应字符是否一样),而equals()方法先比较地址再比较每个字符,只有每个对应字符不同时 ,才返回false,其他都返回true。
发布了34 篇原创文章 · 获赞 8 · 访问量 709

猜你喜欢

转载自blog.csdn.net/weixin_45720626/article/details/104867661