关于== 和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。
最后感谢语:谢谢大家的支持,如果有不明白的或者建议的留言哈!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)