Java中 equals和==的区分, new Integer和 非new的区别
-
首先我们要知道在 == 比较的是内存地址值(不包括8种基本数据类型)
equals比较的是两个值(内容)是否相同。
-
但是使用equals比较值是否相同的前提下:是该类型重写了父类里的equls方法。
在java中所有类都直接或间接继承了Object类,而Object类中的equls方法 调用的是
==(即也判断地址是否相等)
-
并且在在java原生Api中基本大多类都重写了equals方法
package com.ch;
/**
* @author chenghao
* @purpose:针对equals和 == 区分,篇Integer
* @备注:注意new Integer 和 非new Integer
* @data 2022年04月28日 09:46
*/
public class EqualsOrDoubleDengHao {
public static void main(String[] args) {
int s = 12;
int v = 12;
System.out.println(s==v); //=====>基本数据类型 == 比较的是值,注意:String是一个类形 true
//System.out.println(s.equals); ======>8种基本数据类型没有equls方法
Integer S1 = 8;
Integer S2 = 8;
System.out.println(S1 == S2);//true 注意:此时S2并没有创建对象,注意new出来的和非new出来的区别
System.out.println(S1.equals(S2));//true
Integer s3 = 200;
Integer s4 = 200;
System.out.println(s3 == s4); //false 注意:这里也是非new出来的,为什么不是同一个对象,因为在非new情况下,-128到127的范围内,
// 不会创建新的对象,而是从IntegerCache中获取的。
System.out.println("============================");
Integer integer = new Integer(7);
Integer integer1 = new Integer(7);
System.out.println(integer == integer1); //false
System.out.println(integer1.equals(integer));//true
}
}
------疑问
Integer S1 = 8;
Integer S2 = 8;
• System.out.println(S1 == S2);//true
-------为什么这里显示为true?
Integer是一个引用类型,并且重写了equals方法,==又比较的是两个对象的内存地址值,应该返回为false呀。
-------这里得从new Integer和Integer xx 说:
-
new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱
-
Integer当变量值在-128~127之间时,非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同;
-
Integer判断是否相等推荐使用
.equals() -

浙公网安备 33010602011771号