==
:
==
比较的是变量
(
栈
)
内存中存放的对象的
(
堆
)
内存地址,用来判断两个对象的地址是否相同,即是
否是指相同一个对象。比较的是真正意义上的指针操作。
1
、比较的是操作符两端的操作数是否是同一个对象。
2
、两边的操作数必须是同一类型的(可以是 父子类之间)才能编译通过。 3
、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为
true
,如:
int a=10
与
long b=10L
与
double c=10.0
都是相同的(为
true
),因为他们都指向地
址为
10
的堆。
Integer a1 = 110, a2 = 110, a3 = 140, a4 = 149; System.out.println(a1 == a2);//true System.out.println(a3 == a4);//falseInteger a = new Integer(3); int b = 3; Integer c = 3; System.out.println(a == b);//true System.out.println(a == c);//false a new了一个新对象,所以用==比较的是内存中的存放地址
equals
:
equals
用来比较的是两个对象的内容是否相等,由于所有的类都是继承自
java.lang.Object
类的,所
以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是
Object
类中的方法,而
Object
中的
equals
方法返回的却是
==
的判断。
总结:
所有比较是否相等时,都是用
equals
并且在对常量相比较时,把常量写在前面,因为使用
object
的
equals object
可能为
null
则空指针
在阿里的代码规范中只使用
equals
,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来
排查老代码使用
“==”
,替换成
equals
Integer i = 2;
Integer i1 = 2;
int i2 = 2;
Integer i3 = 200;
Integer i4 = 200;
System.out.println("2".equals(i));//false 这个应该是String和Integer比较,肯定不一样啊
System.out.println(i1.equals(i)); //true 以下比较的都是常量
System.out.println(i.equals(i2)); //true
System.out.println(i3.equals(i4));//true