equals()和==的区别(Java)
“==”用法
- 基本数据类型:双等号比较的是值
- 引用数据类型:双等号比较的是内存中的地址
equals()用法
- 没有重写equals()方法:比较内存中的地址
- 重写了equals()方法:参照重写的方法
我的理解是基本数据类型的值是直接存储在栈里的,根据内存地址可以直接拿到值,所以比较的是值;而引用数据类型指向的是一个堆中的内存地址,他指向的是一个对象,他在堆中占用的内存空间可能指向了多个栈中的地址,所以对于对象而言==比较的是内存地址。
重写了equals()方法的类:
String:
重写的equals()方法比较字符串内容;
字符串判等全部使用equals()方法,双等号是根据内存地址进行判断。
判断字符串是否为null时用==,判断是否为空串时比较长度 eg. string.length()!=0
Integer:
重写的equals()方法比较整形变量的值;
注:当给Integer对象赋值时,-128到127之间的值会缓存到IntegerCache.cache中,所以给Integer对象赋值在-128到127之间时,返回的是同一个对象,此时用双等号和equals()方法比较都为true
Java自动装箱规范要求boolean、byte、char<=127,介于-128~127之间的short和int被包装到固定的对象中。
注:所有相同类型的包装类对象之间值的比较,全部使用equals()方法比较。
枚举类:
eg:
public enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE};
这个声明定义的类型其实是一个类,它刚好有4个实例。比较两个枚举类型的值时,永远不需要调用equals,直接调用“==”即可。
类对象(反射):
虚拟机为每个类型管理一个Class对象,因此可以利用==运算符实现两个类对象比较,eg:
Employee e = new Employee();
if(e.getClass()==Employee.class){
}
Null:
-
如果对比对象object不为null,则object==null将返回false,否则返回true
-
如果对比对象object不为null,object.equals(null)会返回false,否则抛出空指针异常NullPointerExceptrion
所以和null对比只能用==;
发现新的再更新 #_#