一直以为 == 就是比较地址 equals 就是比较值
下面的排版有点小乱 主要写了一下几个方面:
== ( 基本数据类型(Integer), 引用数据类型)
equals (举了String Date 的栗子)
==
基本数据类型: byte,short,char,int,long,float,double,boolean
比较值 (因为基本数据类型是存放在栈里, 当两个基本数据类型的值相等时,地址也是相等的)
int c = 227;
int d = 227;
System.out.println(c == d); //true
特殊的:基本数据类型的封装型:
例如Integer:
Integer a = new Integer(12);
Integer b = new Integer(12);
System.out.println(a == b); //肯定是false 毕竟是两个对象
Integer a1 = 127;
Integer b1 = 127;
System.out.println(a1 == b1);
Integer a2 = 128;
Integer b2 = 128;
System.out.println(a2 == b2);
// 两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false,
Integer a3 = -128;
Integer b3 = -128;
System.out.println(a3 == b3);
Integer a4 = -129;
Integer b4 = -129;
System.out.println(a4 == b4);
这跟Integer.valueOf()的缓冲对象有关, 直接看源代码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// 如果 i 是在IntegerCache.low和 IntegerCache.high之间的话, 直接从缓存中取出,否则new 一个对象!!!
摘自[点击此处](https://www.polarxiong.com/archives/Java-Integer%E7%94%A8-%E6%AF%94%E8%BE%83%E6%97%B6127%E7%9B%B8%E7%AD%89128%E4%B8%8D%E7%9B%B8%E7%AD%89%E7%9A%84%E5%8E%9F%E5%9B%A0.html)
- 引用数据类型:仅仅比较地址
class People{
public String name;
public String sno;
}
public class Test01 {
public static void main(String[] args) {
People p1 = new People();
p1.name = "张三";
p1.sno = "1111";
People p2 = p1;
System.out.println(p1 == p2); // true
p2.sno = "2222";
System.out.println(p1 == p2); // true
// 后来反应过来 两个地址相同的数据 所对应的值也是相等的.......
}
}
================================================================
equals
在Object 类中equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
所以对于一般的没有重写(覆盖)equals方法的类 在使用equals方法的时候和使用 == 的效果是一样的 即比较两个对象的地址
有一些类重写了Object类的equals 方法 例如:String、Date、Integer
String:
// 如果地址相同 返回true
// 如果类型相同 且 其值相同 返回true
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Date:
扫描二维码关注公众号,回复:
4126541 查看本文章
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
总结:
== 比较两个对象的地址 ; 没有重写equals方法的类的对象比较效果与使用双等号相同, 如果重写了equals 方法 就按照重写的规则。