java笔试中常常遇到==和equals比较符,现在总结如下,如有错误,欢迎指正。
正常情况下
==
- 作用于基本数据类型的变量时,比较的是值
- 作用于引用类型的变量时,比较的是地址
equals
- equals不能作用于基本数据类型的变量比较
- 如果没有对equals方法进行重写,则比较的是引用类型的变量所执行前的对象的地址
- 诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容
特殊情况
Integer中的==
Integer中引入了Integer缓存,默认缓存-128~127之间的数字,这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用(这相当于调用 valueOf 方法),使用构造器创建的 Integer 对象不能被缓存。
实例:
/*
* 出现这种异常情况满足三个条件:
* 1.Integer对象比较
* 2.==操作符
* 3.在范围-128~+127内
* 4.自动装箱或valueOf创建
*/
Integer t1 = 127;//Integer t1 = Integer.valueOf(127);
Integer t2 = 127;//Integer t2 = Integer.valueOf(127);
System.out.println(t1==t2); //true
System.out.println(t1.equals(t2));//true