关于Java中equals和“==”在对象方面上的问题以及hashCode


public class Person {
    private int age;
    private String name;
    public Person(){

    }

    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }
    public void show(){
        System.out.println(age+"\t"+name);
    }
    public static void main(String[] args) {
        System.out.println("hello01");
        Person p = new Person();
        Person p1 = new Person();
        System.out.println(p1.hashCode());
        System.out.println(p.hashCode());
        System.out.println(p==p1);
        System.out.println(p.equals(p1));
        System.out.println("-----------分割线--------------");

        Person a = new Person(18,"小明");
        Person a1 = new Person(18,"小明");
        System.out.println(a1.hashCode());
        System.out.println(a.hashCode());
        System.out.println(a==a1);
        System.out.println(a.equals(a1));
    }
}

问题1
equals比较的是两个对象的内容我认为应该是一样的,但是结果却是false,这个方法比较的到底是什么?

问题2
hashCode值打印出来后,关闭程序,然后重新打开IDEA运行还是原来的值,每次创建对象不都是随机地址吗?而且对象在用完后不是会被销毁吗?有点蒙了

求解答

问题一:在没有重写equals的类中,equals比较的是地址值,重写了equals才是比较的内容;如果想得到true结果,重写一下equals方法即可。
问题二:hashCode的值不是随机地址值,而是根据内容计算出来的hash值,所以内容一样,hashcode值是一样的。
ps.当然内容不一样也可能出现hsahcode一样的情况。
这两个你应该是记混了

equals比较的是引用数据类型的地址值,new 关键字就是开辟一个新的地址空间
new 出两个对象来就是两个地址值,即使内容一样,用equals方法比较就是false
hashCode方法是把对象存储的数据经过java的算法生成的一串数字,new出来俩个内容相同的对象hashCode值是一样的

在没有重写的情况下是这样的。

img

img