“==”:是运算符。如果两个变量是基本数据类型,因为==为运算符,会强制转型,则只要两个变量的值相等,就返回true;对于两个引用数据类型变量,比较的是地址,必须指向同一个对象,才会返回true。
“.equals()”:是Object类的方法。
1.没有重写equals方法:Object比较的是地址,与“==”没有区别
2.重写了equals方法:如String、Integer、Date等。就直接比较值是否相等,如果相等返回true.
【注意】:
1.在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果
2.基本数据类型不支持equals方法
当基本包装类型比较时:
“==”:如Integer和int,Long和long比较,会拆箱;如有一方为非包装类,Integer和double比较,也会拆箱;如有两方都为包装类,Double和Integer比较,在不遇到算数运算的情况下,均不会拆箱,编译会报错。
“.equals()”:不处理数据转型,如有两方都为包装类,Double和Integer比较,两个为不同的类型,编译会报错。
自动拆装箱:Java编译器在基本数据类型和对应的对象包装类型之间做一个转换。
8种基本数据类型:byte short int long float double char boolean
对应的包装类型: Byte Short Integer Long Float Double Character Boolean
对于Integer对象,JVM会自动缓存 -128~127 范围内的值,在这个范围内的值相等
例1:
i01==i02; 正确,i02是基本数据类型,i02会拆箱成int,所以i01和i02都是基本数据类型,直接比较值。
i01==i03; 正确,i02与i03都是引用传递,指向同一个对象实例,所以地址相同
i03==i04 ; 错误,i03与i04地址不同,所以不相等
i02==i04; 正确,与第一个相同
例2:
Integer i = 42;
Long l = 42l;
Double d = 42.0;
i==l; i==d; l==d; 错误,不会拆箱,不是同一个类型,编译报错。
i.equals(d); d.equals(l); i.equals(l); 错误,编译通过,但是equals不会数据转型,不是同一个类型。