总结:
==:比较的是地址
equals:Integer,String,Date,Double比较的是值得大小(其他的例如char等,因为它没有重写equals方法,equals方法本身比较的是地址,下文详细说明)
分析:
1、==
1、基本数据类型(byte、short、int、long、float、double、char、boolean) ,==比较的是“值”是否相等。
(因为值相等的基本数据类型在内存放在同一地方。)
Double a1 = 10.0;
float a2 = 10f;
long a3 = 10;
short a4 = 10;
int b1 = 10;
boolean c1 = (a1 == b1);
boolean c2 = (a1 == a2);
boolean c3 = (a3 == a4);
System.out.println(c1+" "+c2+" "+c3);
结果:
2、如果是引用类型变量,比较的是对象的地址。
引用类型:是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。
运行结果:
2、equals
1、equals方法不能作用基本数据类型,除了(char,boolean,Double),
2、equals方法比较的是引用类型的变量所指向的对象的地址(没有被重写过的),object类中的方法
源码:
该equals
类方法Object
实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值x
和y
,当且仅当x
和y
引用相同的对象( x == y
具有值true
)时,该方法返回true
。
- 自反性 :对于任何非空的参考值
x
,x.equals(x)
应该返回true
。 - 它是对称的 :对于任何非空引用值
x
和y
,x.equals(y)
应该返回true
当且仅当y.equals(x)
回报true
。 - 传递性 :对于任何非空引用值
x
,y
和z
,如果x.equals(y)
回报true
个y.equals(z)
回报true
,然后x.equals(z)
应该返回true
。 - 它是一致的 :对于任何非空引用值
x
和y
,多次调用x.equals(y)
始终返回true
或始终返回false
,没有设置中使用的信息equals
比较上的对象被修改。 - 对于任何非空的参考值
x
,x.equals(null)
应该返回false
。
3、Integer,String,Date,Double等类会对equals方法重写(char没有被重写)
1、Integer重写的源码:
观察源码,因为有.intValue()方法, 所以Integer比较的是值得大小
结果是 true
2、String重写的源码:
观察源码可知道,先比较地址,地址一样的话返回true,地址不一样的话 转换成char数组来比较值。
所以当值相同的话会返回true。
3、Double重写的源码:
观察源码可以知道,比较的是值的大小。
4、char的源码:
char类型是特例,它比较的是 地址。
运行结果: