在开始讨论标题这个问题之前我们先搞清楚几个概念:
1.基本数据类型和引用类型
我们知道java数据类型一般有俩大类,第一种基本数据类型,第二种引用类型。基本数据类型是没有引用这个概念的,例如 int a = 1,a 是直接存放在堆栈中直接指向它的内容。而平时我们使用的User user = new User(),我们创建的对象是保存在堆中,user是引用类型,它保存在堆栈中,保存的内容是User对象在堆中的地址。
当我们使用 == 比较基本数据类型的时候是比较他们的值是否相等。
使用 == 比较俩个引用的时候是比较他们在内存中指向的是否是同个对象
User user1 = new User();
User user2 = new User();
System.out.println(user1==user2);
输出结果:false,因为user1 和user2 指向的是不同的内存地址。
在Object类的源码中有个equals()方法也可以用来比较俩个引用是否相同,它内部也是使用了 ==
public boolean equals(Object obj) {
return (this == obj);
}
至于String类的equals()方法为什么当value值一样就返回true?
是因为String重写了equals()方法和hashCode()方法
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