1.两者对比的原理
这里所说的“==”是指对比两个对象是否相同的操作,即比对的是两个变量或实例是不是指向相同的引用(指针比较);
equal()方法对比的则是两个变量会实例所指向内存中存储的值是否一致,即对比的相对应实例或对象的值是否相同;下面使用例子来说明一下。
String s1 = new String("hehe");
String s2 = s1;
String s3 = new String("hehe");
System.out.println(s1 == s3);
System.out.println(s1 == s2);
System.out.println(s1.equals(s3));
输出:
为了更好的说明,我们来查看一下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;
}
2.扩展知识(值传递和引用传递)
上面举得例子都是字符串的比较,下面举个整型的比较来简单描述一下,后面引出值传递和引用传递的区别。
整型的比较很简单,就是直接使用==就可以了,不用那么麻烦搞个equals什么的比较。但是下面折腾一下来说明。
int i1 = new Integer(1);
int i2 = new Integer(1);
System.out.println(i1 == i2);
System.out.println(Objects.equals(i1, i2));
上面代码的输出结果都是true,这是因为equal源码里面的定义也是直接调用==来比较的。这时可以看出,两者为什么会有这样区别,这时因为整型和字符串的赋值是不一样的。
2.1搞清楚基本类型和引用类型的不同之处
num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。
int num=10;
String str="hello";
2.2搞清楚赋值运算符(=)的作用
对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,“hello” 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)