==
== 比较的是变量(栈)内存中存放的对象的(堆)地址是否相同,即是否为同一个对象, 比较的真正意义是指针上的操作
此时我们可能有一些疑问,如果是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
4java.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
21java.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方法跟调用==是没有什么区别的!