在初期学习java时,肯定会遇到==和equals的区别这一知识点,其实很简单,一句话:equals:比较字面值;==:不止比较字面值,还比较对象的内存地址。
先来一段代码:
@Test
public void test(){
String str1="abc";
String str2="abc";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
//结果都为true,因为str1创建时在堆中开辟了一块新的内存,存储abc,str则保存在栈中,而str2在创建时,由于abc已经
//存在,所以直接把内存地址给str2,而没有重新开辟新的内存地址,所以,打印结果都是true
String str3=new String("def");
String str4=new String("def");
System.out.println(str3==str4);
System.out.println(str3.equals(str4));
//==打印的是false,equals打印的是true,因为new String 不管之前的内容是否在内存中已经存在
//在新定义时,都会重新开辟一块内存来存储这块内容,从而str3和str4的内存地址是不同的。
}
追一下源码:
从new String()的源码可以看出,new String()会更改hash值,因为重新new出来的对象是会在堆中开辟内存来存储新对象的,内存地址不同,==所返回的值肯定是不同的。
另外,String重写了hashCode方法和equals方法;