Java 判等问题

  1. 1. equals vs ==
    1. 1.1 equals方法的实现
    2. 1.2 使用Lombok的小坑

1. equals vs ==

  • 对于基本类型,应使用==,比较的是值
  • 对于引用类型,需要使用equals,进行内容判等。使用==判断的是指针 –> 代表的是两个对象在内存中的地址

这里要注意的是Java是有字符串常量池机制的,当代码中出现双引号形式创建字符串对象的时候,JVM会先对字符串进行检查,如果字符串常量池存在相同内容的字符串对象的引用,就将这个引用返回;否则就创建新的字符串对象,然后将这个引用放入字符串常量池当中,并返回该引用

另外一个小坑是Integer在[-128,127]之间的数值是会做缓存的,即对于这中间的数值,即便你直接用==进行判断,有可能是直接会过的…

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

1.1 equals方法的实现

  • equals在Object类当中的定义比较的是对象的引用
public boolean equals(Object obj) {
    return (this == obj);
}
  • 而Integer,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了。如果不一致,那就首先判断类的类型,如果是String类,再进行长度判断,如果长度一致,就逐个比较字符

  • 实现一个equals方法,需要注意
    • 首先进行指针判断,如果对象相同直接返回true
    • 需要对另一方进行判空,空对象和自身的比较结果一定是false
    • 需要判断两个对象的类型,如果类型都不同,那么直接返回false
    • 在确保类型相同的情况下进行类型的强制转换,然后逐一判断所有字段
      • 需要进行类型强制转换是因为我们override的equals方法默认的输入参数是Object

1.2 使用Lombok的小坑

Lombok的@Data注解会帮助我们实现equals和hashcode方法,但是有继承关系的时候,Lombok自动生成的方法是不会考虑到父类的

  • 对于不想进行equals和hashCode判断的参数,可以使用:

    • @EqualsAndHashCode.Exclude
  • 对于想要使用父类属性的场景,可以使用

    • @EqualsAndHashCode(callSuper = true)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:Java 判等问题

文章字数:645

本文作者:Leilei Chen

发布时间:2020-08-27, 04:16:43

最后更新:2020-08-27, 04:17:17

原始链接:https://www.llchen60.com/Java-%E5%88%A4%E7%AD%89%E9%97%AE%E9%A2%98/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏