new出来对象的引用存放在栈,这个真正的对象是存放在堆吗?如果两个对象引用名不一样,但是指向的是堆中同一个对象,那equals 和==比较的是他的引用在栈中的地址吗


public static void main(String[] args) {
        Coder coder1 = new Coder("kuang", "java", 27);
        Coder coder2 = new Coder("kuang", "java", 27);
        System.out.println("coder1 == coder2: " + (coder1 == coder2) 
                + " , coder1.equals(coder2): " + coder1.equals(coder2));
    }

输出都是false

img

你这两个肯定是false
因为你两个都是 new 出来的,new 以后就是在 堆 创建了两个完全不相干的对象数据。
所以你在== 他们的内存地址是不相关的
而 equals 比较的是两个值。但是 你这个是 实体类,不是基本数据类型。要比对的话,需要重写 equals和hashCode方法

在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。

初步认识equals与==的区别:
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
==指引用是否相同, equals()指的是值是否相同

每次执行new都会在堆内存创建新的对象,即使属性一样

你需要重写类里面的equals方法。
重写后第二个是true,但第一个肯定是false,因为比较的是地址

coder1 == coder2 equls与==的区别是,==比较的是具体的数值,equls比较的是地址。你这代码比较的不对,coder1 是一个对象coder2 也是一个对象两个对象的具体数值都是不一样的所以你用==比较具体的数值都是对象的地址,这两个对象你输出就看出来了,你用equls对两个对象比较的时候是对比两个对象的地址,地址都是完全不一样的。可以使用System.out.println(coder1 +" "+coder2);看一下就知道他俩都是地址!