equals跟==的区别

==

== 比较的是变量(栈)内存中存放的对象的(堆)地址是否相同,即是否为同一个对象, 比较的真正意义是指针上的操作

此时我们可能有一些疑问,如果是int a=1; int b=1;此时我们a==b,为什么为true呢?
我们上面说说, == 是比较内存地址是否相同,是指针上的操作比较,如果为true的话,就说明一个问题!那就是a和b的值都是指向同一个地址!因为都是1嘛,1这种数据都是会放在 常量池 里面。
不仅a可以等于b,如果long b=1L; double c=10.0;他们彼此之间都会相等

equals

equals用来比较两个对象的内容是否相等,equals是Object的方法
源码上看,其实是没有区别的,我们看Object类的源码

1
2
3
4
java.lang.Object#equals
public boolean equals(Object obj) {
return (this == obj);
}

底层只是调用==
但是我们所有的类都是Object类的子类,都可以重写equals的方法,比如String,他重写了Object的equals的方法,用equals方法来比较每个String对象里面value值是否相等,所以String类型的equals跟==是有区别了!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java.lang.String#equals
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;
}

如果类没有重写equals,那么调用equals方法跟调用==是没有什么区别的!