简单来说
1.==是比较两个对象所对应的地址是否相等,
2.equals是比较两个String的表达式是否相等
public static void main(String[] args) {
String a = new String("abc");
String b = new String("abc");
System.out.println("a==b?" + (a==b) + " a.equals(b)?" + (a.equals(b)));
}
首先,要明白当我们new了一个对象的时候,就一定会在堆里面给他分配一个地址,这里就需要复习一下JVM中的内存分配了,不太清楚的可以看看这篇文章,所以上面a,b两个对象,在堆中的地址肯定是不同的,==就是false,但是因为他们的表达式都是"abc",所以equals是true。
然后我们再看一个例子
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println("a==b?" + (a==b) + " a.equals(b)?" + (a.equals(b)));
}
这里结果就跟上面的不一样了,这个就更得复习一下JVM内存的一些知识了,因为String没有new对象,所以属于常量,在分配内存的时候会被放入常量池,而在常量池中,根据String的表达式"abc"查找,如果有相同的表达式,那么这个String会直接指向之前就存在的"abc"的引用地址,所以==的时候地址也是相同的,如果没有"abc"这个常量,那么就会重新分配地址,那么这个时候两个表达式就都是false了,如下
public static void main(String[] args) {
String a = "abc";
String b = "abcd";
System.out.println("a==b?" + (a==b) + " a.equals(b)?" + (a.equals(b)));
}
所以综上,如果String不是new的对象的话,只是直接的基础数据类型,那么==和equals都可以用,但是如果是对象的话就要根据需求去选择了。