美文网首页
==与equals()

==与equals()

作者: 8813d76fee36 | 来源:发表于2018-04-26 12:40 被阅读6次

    前言

    Java中涉及到“判断相等”的操作必然离不开==与equals(),最初学习Java时背某“面试宝典”的时候就有过相关的问题的记录:

    A:“说说Java中==与equals()”的区别。
    Q:“==比较内存地址值,equals()比较对象的内容。”

    首先说上面的答案看起来清晰明了,但回答的不完整,只针对了某些情况。下面将简要分析一下==与equals()。

    关于==

    == 是Java中的一个内置的布尔逻辑运算符,表示等于
    在使用==做判断的时候,根据参与比较的成员类型不同,其比较原则也不同。

    基本类型使用 ==

    当==两端是基本类型时,比较的是两者的字面值。
    如:

    int num1 = 3;
    int num2 = 3;
    int num3 = 5;
    
    char char1 = 'a';
    char char2 = 'a';
            
    System.out.println(num1 == num2); // true
    System.out.println(num1 == num3); //false
    System.out.println(char1 == char2); //true
    

    引用类型使用 ==

    当==两端是引用类型时,比较的是两者的内存地址值是否相同。

            User user1 = new User(); // new 一个新对象
            User user2 = new User(); // new 一个新对象
    
            User user3 = user2; // 将user2存储的引用值赋值给变量user3,两者包含相同的引用值。
            
            System.out.println(user1 == user2); // false
            System.out.println(user2 == user3); // true
    

    关于equals()

    equals()方法是Object类的方法,并提供了实现,返回双方使用==比较的结果。

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

    一般情况下需要重写equals()方法实现比较逻辑。比如String类和基本类型的包装类都自己实现了equals()方法。

    • String类的equals实现
    public boolean equals(Object anObject) {
            if (this == anObject) { // 如果是相同对象,则直接返回true。
                return true;
            }
            if (anObject instanceof String) { //如果是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) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    
    • Integer类equals()实现
    public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                //通过intValue()取到数值,并使用==比较两者数值
                return value == ((Integer)obj).intValue();
            }
            return false;
        }
    

    所以equals()方法可以根据自己的需求,规定对象中哪些值相同即可认为相同的逻辑。

    补充

    比较对象是否相同还有一个重要的方法就是hashCode();通常我们需要一起重写hashCode()和equals()方法,虽然这不是必须的,但这样做可以更严谨地判断对象是否相同。
    不同的对象hashCode不同,但hashCode相同也不一定是同一个对象,这时需要借助equals()方法继续判断。
    例如Set在判断元素是否重复的时候,会先比较元素的hashCode是否相同,若hashCode不同,则元素没有重复,可直接加入到集合中;若hashCode相同,则会进一步调用equals方法判断对象是否相同。

    相关好文:

    java中==与equel的区别
    为什么重写equals时必须重写hashCode方法?
    Java中float和double数据类型的正确比较方式
    lombok @EqualsAndHashCode 注解的影响

    相关文章

      网友评论

          本文标题:==与equals()

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