我对于这个知识点一直是很模糊的,今天弄清楚了,就记下来,免得以后又忘了。
下面就上Test代码,我来说一下我的理解:
public static void main(String[] args) {
//第一轮
int a = 1;
int b = 1;
System.out.println(a==b);
System.out.println("--------");
//第二轮
String str = "abc";
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println("--------");
//第三轮
str1 = str;
str2 = str;
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
}
这里是输出
第一轮输出的部分:
用"=="比较两个int常量。两个常量都赋值为整数1,比较结果是true。
原因是"=="符号比较基本类型数据时比较的是两个变量的值,值相同就返回true。
第二轮输出的部分:
当"=="符号作用的对象是引用数据类型时,比较的的是两个变量指向的地址,地址相同则返回true,不同返回false。
变量str1使用 new String("abc")进行赋值,结果是str1保存在栈中,指向堆中 new String()的地址;
变量str2直接赋值为"abc",结果是str2指向常量池中"abc"的地址,即指向方法区中的地址。
(堆和方法区的存在源于java的内存分配机制)
所以使用"=="比较时,返回的是false。
因为String类重写了equals()方法,让equals()方法仅仅比较指向的对象所存储的值是否相同。所以使用equals()比较时返回的时true
第三轮输出的部分:
将变量str1和变量str2都指向变量str,让它们指向的地址相同。所以不管是使用"=="还是equals()都会返回true。
总结:
使用"=="进行比较:
1. 若比较的对象是基本数据类型,那么就比较值的大小
2. 若比较的对象是引用类型时,就比较这两个对象所指向的地址是否相同
使用equals进行比较:注意:基本数据类型的变量没有equals方法
1. 若重写了equals方法(String类重写了equals()),那么就比较两个变量的值
2. 若没重写equals方法,那么还是比较两个变量所指向的地址
谢谢各位的浏览。如果有理解错误的地方,希望可以提出来。