Java的==和equals

作者: 灰灰H_K | 来源:发表于2019-08-26 11:33 被阅读0次

    在平常工作和学习中,我们一般用==和equals来比较两个对象或数据是否相等。但是什么时候用equals,什么时候用==一直都不怎么清楚,今天整理了下;

    首先看看Java的栈空间和堆空间的地址引用

    1.png

    ==的说明

    在Java中,==对比的是两个对象在空间里的地址是否一致,比如上图的s2==s3返回的是false,s5==s6返回的是为true。话不多说,上代码。

    public class demo2 {
        public static void main(String[] args) {
            String s1=new String("t1");
            String s2=new String("t2");
            String s3=new String("t2");
    
            String s4=new String("t3");
            String s5="t3";
            String s6="t3";
    
            System.out.println("s2==s3:"+(s2==s3));
            System.out.println("s5==s6:"+(s5==s6));
        }
    }
    

    结果:


    2.png

    这是因为==比的是在空间里的地址,s2和s3在堆里面是两个不同的对象,所以地址也不同,自然返回就是false。s5和s6是Java的基础数据类型,指向的是常量池里同一个引用,所以地址也相同,返回的就是true。

    equals的说明

    每个Object里的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

    总结

    所以一般如果是对比两个对象是否相等的话,用==就可以。但是如果你要对比两个值是否相等的话,就要用equals了,因为如果用==就会出现上面明明值相等,返回却是false的情况。

    个人博客地址: https://mjava.top

    相关文章

      网友评论

        本文标题:Java的==和equals

        本文链接:https://www.haomeiwen.com/subject/nddrectx.html