Java 基础 equals() 与 “==” 的区别

教程 shanhuhai 856℃ 0评论
  • “==” 对比两个对象的内存地址。
  • equals()方法与 “==” 效果默认相同,即对比内存地址,除非 equals() 方法在类中被重写(Override),则对比是走重写后的方法进行对比
  • obj.hashCode()可以被覆写,使用System.identityHashCode(obj) 读取对象的内存地址,且永远不会变

实例代码如下

package com.shh.base;

import java.util.Objects;

public class equal {

    public static void main(String[] args) {
        Scout scout  = new Scout("小杨");
        Scout scout1 = new Scout("小杨");

        //将 scout 对象赋给 scout2,实际 scout2 和 scout 指向了同一个对象
        Scout scout2 = scout;

        System.out.println(scout == scout2); //true
        // 因为指向同一个对象,所以 当 scout2的name属性被改变时, scout的对象的也同样改变。
        scout2.name = "小李";
        System.out.println(scout.name);

        //因为覆写了 hashCode 方法,所以三个对象得出的结果一样
        System.out.println(scout.hashCode());
        System.out.println(scout1.hashCode());
        System.out.println(scout2.hashCode());

        //只要是不同的对象,使用System.identityHashCode 方法获取的hasCode一定不一致,且不会因为 hashCode方法被覆写而变化
        System.out.println(System.identityHashCode(scout));
        System.out.println(System.identityHashCode(scout1));
        System.out.println(System.identityHashCode(scout2));

        //因为 scout 和 scout1 两者的内存地址不一样, 所以为false
        System.out.println(scout == scout1);

        //因为equals()方法被覆写,新方法以name 属性的值进行哈希比较, 因为两个对象name属性值相同,所有对比结果为true
        System.out.println(scout.equals(scout1));
    }
}

class Scout {

    public String name;

    public Scout(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Scout scout = (Scout) o;
        return Objects.equals(name, scout.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}



两种 String 实例化方式的区别

通过下面的例子可以看到,两种 String对象初始化的区别。


public class HashSet01 {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        String name = "李四";
        String name2 = "李四"; 

        System.out.println(name.hashCode());
        System.out.println(name2.hashCode());
        System.out.println(System.identityHashCode(name)); 
        System.out.println(System.identityHashCode(name2));

        System.out.println(name2 == name);// name 和name2 由于内存地址相同,即是同一个对象, 返回true
        System.out.println(name2.equals(name));

        //再看另外一种方法,new String()
        String p1 = new String("张三");
        String p2 = new String("张三");

        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        System.out.println(System.identityHashCode(p1));
        System.out.println(System.identityHashCode(p2));
        System.out.println(p1 == p2); // 这两个不是的对象,内存地址不一样,所以 返回false
        System.out.println(p1.equals(p2)); // String的equals方法判断的结果

    }
}

注意: String对象,如果内容相同,即字符串相同,那么 hashCode 得出的值是一致的,但是通过 System.identityHashCode 获取的内存地址不一致,所以是不同的对象
将内容相同的两个 String 对象写入HashSet 时,由于 hashCode一致, 且通过 equals方法计算的结果一致,所以,即便是通过 new String() 创建的对象,只要内容相同,还是不能重复写入。

转载请注明:大后端 » Java 基础 equals() 与 “==” 的区别

付费咨询
喜欢 (21)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址