String str1=“aa”;
String str2=new String(“aa”);
String:
首先在栈区创建一个str1的引用,然后在字符串实例池(不同于堆和栈,它是独立的,存储的是不可变化的变量)去查找是否存在字符串的内容是: aa的对象,如果在字符串实例池中不存在这个对象,则创建一个,然后str1指向实例池中的这个对象,如果存在,则直接将str1指向实例池中的这个对象;如果后面又一个定义字符串变量str3= “aa”,则这个str3直接指向实例池中已经存在的 aa,这个时候不再重新创建对象了;如果比较str1 == str3操作,则返回true,因为它们所指向的地址是一样的。
new String:
对于new String(“aa”)则不管怎么样,都会创建新的对象,至少创建一个对象,会在堆中创建一个包含字符串"aa"的对象(如果在常量池中有aa了,那么就只是在堆中创建了aa而已,即只创建了一个对象),如果在常量池中没有aa,那么在常量池中也会创建一个aa的对象(此时就生成了两个对象),str2保存的值是这个包含"aa"的对象的内存地址,即str2指向这个"aa"这个对象;同时new String在堆中创建的对象是不能被引用的,例如String str2=new String(“aa”)后,b=“aa”,使用==进行比较的时候,结果为false。
PS:==与equals的区别
==是比较基本数据类型,比如int,long,double等数据是否相等,比较的就是栈中的这个变量的值是否相等,而equals比较的是这个变量中的值所指向的值是否相等,是拿来比较对象之间的值是否相等;
简单来说,==比较的是变量在栈内存中存放的内存地址,而equals比较的是变量在栈内存中存放的内存地址所指向的那个对象的值