==和equals有什么区别?
1、比较基本数据类型
- == 是比较两个基本数据类型的值是否相等
- equals 是比较两个基本数据类型对象的值是否相等,因为这些基本数量类型的对象都重写了equals方法。
public static void main(String args[]){
int a = 12;
int b = 12;
System.out.println("基本数据类型比较:a==b-->" + (a== b));
Integer a1 = 12;
Integer b1 = 12;
Integer b2 = 123;
System.out.println("基本数据对象类型比较==:a1==b1-->" + (a1== b1));
System.out.println("基本数据对象类型比较equals:a1.equals(b1)-->" + (a1.equals(b1)));
System.out.println("基本数据对象类型比较equals:a1.equals(b2)-->" + (a1.equals(b2)));
}
Integer的equals源码:
2、比较对象
- ==是比较两个对象的地址是否相同
- equals
a:未重写equals方法的时候:
比较两个对象的地址是否相同。
b:重写了equals方法:
比较两个对象的内容是否相同。
public static void main(String args[]){
UserDTO user1 = new UserDTO();
user1.setPersonName("张三");
UserDTO user2 = user1;
UserDTO user3 = new UserDTO();
user3.setPersonName("张三");
System.out.println("对象类型比较==:user1==user2-->" + (user1 == user2));
System.out.println("对象类型比较equals:user1.equals(user2)-->" + (user1.equals(user2)));
System.out.println("对象类型比较==:user1==user3-->" + (user1 == user3));
System.out.println("对象类型比较equals:user1.equals(user3)-->" + (user1.equals(user3)));
}
3、Integer对象在127以内 == 返回true,超出127 == 返回false
public static void main(String args[]){
Integer a1 = 128;
Integer b1 = 128;
System.out.println("基本数据对象类型比较==:a1==b1-->" + (a1== b1));
System.out.println("基本数据对象类型比较equals:a1.equals(b1)-->" + (a1.equals(b1)));
}
因为-128-127是byte的取值范围,在此范围内自动拆装箱不会创建新对象,从常量池中直接获取,如果超出取值范围,就会重新创建对象,这就是Integer a1 = 128, Integer b1 = 128,而a1==b1返回false的原因。
Integer.valurOf源码如下:
// low=-128,hige=127
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
常量池的好处:
1:节省内存空间,可以避免频繁的创建和销毁对象,实现了对象的共享,常量池中所有相同的对象只有一个,只占用一个空间;
2:节省运行时间,比较字符串时,==比equals快