小白蛋挞 2022-04-03 12:55 采纳率: 85%
浏览 91
已结题

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

  • 写回答

4条回答 默认 最新

  • 嘉祐-小萝卜算子 2022-04-03 13:19
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?