关于== 和equals 的区别

关于== 和equals 的区别,第1张

关于== 和equals 的区别

关于== 和equals 的区别:
代码参考:

int a1 =127;
int b1 =127;
Integer a =127;
Integer b = new Integer(127);
System.out.println("a1和b1---------"+(a1==b1)+"-------基本类型没有equals()");
System.out.println("a1和a---------"+(a1==a)+"-------"+a.equals(a1));
System.out.println("a1和b---------"+(a1==b)+"-------"+b.equals(a1));
System.out.println("a和b---------"+(a==b)+"-------"+b.equals(a));
返回值:
    a1和b1---------true-------基本类型没有equals()
    a1和b---------true-------true
    a1和a---------true-------true
    a和b---------false-------true

总结:
“== ” 在基本类型 中 比较的是对象的内存地址,因为当a1赋值为127时,jvm给127在栈中提供一块内存,和内存的引用地址来存储127(栈中存基本类型数据和对象的引用地址),由于栈是共享的,第二次 创建 b1 的时候,因为内存中已存在127,所以b1会引用a1的地址,地址相同后内容肯定相同;
在封装类型中 比较的是对象的引用地址; new 的对象存在 堆中,堆中的对象不共享,所以每次new 时 ,都会在重新分配空间进行存储;这时他的堆内存地址 自然不相同;(而代码中Integer a =127 因为没有使用 new ,jvm不会进行对象创建)
equals 在obj 中 比较的是 对象的引用地址;
当equals被重写的时候,比如:String中的equals 比较的是内容;
而关于 int类型 和Integer 类型的比较 不管是 == 和equals 都是相等的(返回true),因为会自动拆装箱;
关于两个Integer 类型 的比较 :当Integer 的值 超过-128 ~ 127时;
代码参考:

    Integer i1 = 127;
    Integer i2 = 127;
    System.out.println("i1和i2---------" + (i1 == i2) + "-------" + i1.equals(i2));
    Integer i3 = 128;
    Integer i4 = 128;
    System.out.println("i3和i4---------" + (i3 == i4) + "-------" + i3.equals(i4));  
 返回值:
 i1和i2---------true-------true
 i3和i4---------false-------true

总结:
当Integer 的值为<128时,"==" 返回true 原因是jvm 在初始化的时候会给Integer在常量池中分配数据范围为-128 ~ 127 的数据来存放到内存空间中,每次使用都会去常量池中查是否有这个值,如果有返回对应的内存地址;当Integer 的值=>128时,jvm 会默认new一个对象(因为超过了Integer初始化取值范围-128 ~ 127);这时 i3和i4 new的对象存在了堆中,所以两个对象的内存地址不同,==会false,而Integer 重写了equals(),内容相同所以equals 为ture。

最后感谢语:谢谢大家的支持,如果有不明白的或者建议的留言哈!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5573129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存