前言
equals()方法和“==”判断,可能在某些时候,我们难以区别开来他们的作用,所以,这里我就记录下自己的一点点学习心得。
解释
1.equals()方法比较的是两个对象的内容
2.==是比较地址的
String a="123";
String b="123";
System.out.println(a.equals(b));//true
System.out.println(a==b);//true
String c=new String("123");
String d=new String("123");
System.out.println(c.equals(d));//ture
System.out.println(c==d);//false
以上代码,我们看a,b。我们知道【假设知道】,字符串不是基本数据类型,所以它是一种引用数据类型,所以a.quuals(b)的结果为true,是可以理解的,但是为什么a==b的结果还是true呢?这个就涉及到字符串在内存中的存储问题了。
1.简单来讲,虽然字符串是引用类型,所以,这个a和b存储的不是字符串本身的值,而是对应内容的地址。就是a和b储存的是 “123” 字符串在内存中的地址。而我们创建字符串,jvm是不会立即去创建一个新的字符串的,它会去内存里面的堆里面找,看看有没有 “123” 这个字符串,如果有的话,那么就把字符串的地址指向给b【这个时候打印a和b,他们是相等的】。
2.再来看看c和d,他们的都是重新创建一个字符串对象【所以不会去堆内存里面寻找了】,所以,他们在内存中的地址肯定是不一样的,但是他们的内容都是 “123”,所以,这个时候, c.equals(d) 的结果是 true,但是 c ==d的结果是false就可以解释了。
源码
equals()方法的源码:
private final char value[];//String类源码中value的定义
public boolean equals(Object anObject) {
//如果两个对象的地址相等,那么就直接返回true【地址相等,内容一定相等】
if (this == anObject) {
return true;
}
// instanceof 是一个方法,判断前面的对是不是后面类的对象
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;
//长度想等的话遍历所有字符,有一个不相等,返回false,否则返回true
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
//不相等那就返回false
return true;
}
}
return false;
}