Java基础-equals与"=="

Java基础-equals与"=="

在编程过程中,我们经常会遇到判断是否相等的问题,那么就会用到equals和"=="

Demo

public class Demo {
	public static void main(String[] args) {
		String s1 = "zhongyp";
		String s2 = "zhongyp";
		String s3 = new String("zhongyp");
		String s4 = new String("zhongyp");
		String s5 = new String("zhongyp").intern();//下文将有解释
		int a = 1;
		int b = 1;
		System.out.println(s1 == s2);// true
		System.out.println(s1.equals(s2));// true
		System.out.println(s3 == s4);// false
		System.out.println(s3.equals(s4));// true
		System.out.println(s1 == s5);// true
		System.out.println(s1.equals(s5));// true
		System.out.println(a == b);// true
	}
}

程序在运行的时候会创建一个字符串缓冲池,在String s1=“zhongyp”;时,"zhongyp"被放到字符串缓冲池,当String s2=“zhongyp”;时,程序首先会在字符串缓冲池内相同值的对象,所以当s2被创建时,程序找到了s1,将s2引用s1所引用的对象,即s2=s1;

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。所以s5调用的同样是s1的对象,即s5=s1;

在描述equals与= =关系之前,我们应该先了解Java的8种基本数据类型
浮点型:float(单精度浮点型), double(双精度浮点型)
整型:byte(字节型), short(短整型), int(整型) , long(长整型)
字符型: char(字符型)
布尔型: boolean(布尔类型)
基本数据类型的变量直接存储的是“值”,因此在比较基本数据类型时比较的是“值”的本身,使用 = =去比较;
而对于非基本数据类型的变量,非基本数据类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。

而equals比较的是什么呢?我们可以去到jdk目录下的src.zip,解压后的src\java\lang\Object.java

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

可以看出在Object.java的equals中比较的是两个对象是否一致;
当然这只是Object.java中equals的方法,我们应该去Sting.java,因为我们上面用到的非基本数据类型就是String类型(Sting.java在同一目录下)

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

我们可以看出,String类中equals方法是重写了Object类中的equals方法,首先是比较对象是否一致,一致直接返回true,否则继续判断两个字符串的内容是否一致。

小结

对于==
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于非基本数据类型的变量,则比较的是其关联的对象在内存中的地址是否相等。

对于equals
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
若对equals方法进行了重写的话,比较的是所指向的对象的内容,如String类中的equals方法。

注意:equals方法不能作用于基本数据类型的变量,基本数据类型的变量比较只能用==去比较。

猜你喜欢

转载自blog.csdn.net/weixin_40649194/article/details/88970680