Java 中 == 和 equlas() 的区别

“==” 用来比较两个变量的值是否相等。具体而言:

如果两个变量是基本数据类型,使用“==”来比较其对应的值是否相等。

如果变量指向的数据是对象,那么用“==”可以比较这两个对象是否指向同一个对象。(但是不能比较两个对象的内容是否相等)

 
equals是Obeject类中的方法,没有覆盖过的equals方法会直接使用“==”比较两个对象的引用是否相等。
 
但当equals被覆盖,就可以让它比较对象的内容是否相等,比如string对象。
 

看一下Java中String对象到底是如何覆写equals()方法的:

public boolean equals(Object anObject) {
        if (this == anObject) {  //引用相等,指向的同一个对象,肯定是相等的。
            return true;
        }
        if (anObject instanceof String) {  //判断是否是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) {  //转化为char字符串,然后挨个判断值是否相等
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

下面就是这类问题常考的经典题目了:

1、下面这段代码的输出是什么?

public class EQUals {
 
	public static void main(String[] args) {
	
		Integer i1=127,i2=127,i3=128,i4=128;
		System.out.println(i1==i2);
		System.out.println(i1.equals(i2));
		System.out.println(i3==i4);
		System.out.println(i3.equals(i4));
 
	}
 
}

2、下面这段代码的输出是什么?

public class EQUals {
 
	public static void main(String[] args) {
 
		String s1="Hello";
		String s2=new String("Hello");
		String s3=s2;
		String s4=s3.intern();
		System.out.println(s1==s2);
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
		System.out.println(s2==s3);
		System.out.println(s3==s4);
		System.out.println(s3.equals(s4));
	}
 
}

解析:

第一题的答案是:

true:基本类型是判断值相等。
true:Integer的euqlas方法是直接调用 ==的:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

false:JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
true:同上,equals比较的是 intValue。

第二题的答案是:

false :s1和s2引用对象不同。
true:s1和s2的值相同。
true:s1和s3的值相同。
true :s2和s3引用对象相同。
false:当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
true:同上。

发布了45 篇原创文章 · 获赞 1 · 访问量 5232

猜你喜欢

转载自blog.csdn.net/weixin_42814000/article/details/104346045