Java中 == 和 equlas() 的区别

来源:互联网 发布:mac如何卸载梦幻西游 编辑:程序博客网 时间:2024/05/20 19:45

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

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

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



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:同上。

1 0
原创粉丝点击