一、两种创建字符串类型的方法
String str1="Iloveyou";//str1变量值为地址值(这里存疑吧,目前水平还不够,貌似Java中是哈希码),字符串放入String常量池,不开辟新空间 String str2=new String("Iloveyou");//str2变量为地址值(同样存疑),字符串放入堆,开辟新空间
二、几种经典场景判断
String str0="Iloveyou"; String str1="Iloveyou"; System.out.println(str0=="Iloveyou"); //相等,因为str0与其都引用自常量池中同一个字符串 System.out.println(str0==str1); //相等,因为str0与str1都引用自常量池中同一个字符串
String str2="Iloveyou"; String str3=new String("Iloveyou"); System.out.println(str2==str3); //不相等,因为str2是引用自常量池的字符串,而str3中是引用堆中开辟的新空间
String str4=new String("Iloveyou"); String str5=new String("Iloveyou"); System.out.println(str4==str5); //不相等,因为str4与str5中是引用堆中开辟的不同的新空间,即他们是不同的对象
String str6="Ilove"+"you"; System.out.println(str6=="Iloveyou"); //相等,因为编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"Iloveyou"。 //str6引用的是常量池里的字符串,并没有在堆中开辟一块新的空间。
String str7="Ilove"; str7=str7+"you"; System.out.println(str7=="Iloveyou"); //不相等,str7=str7+"you"会导致开辟新的堆空间,str7也不再指向常量池,而是转而指向堆区。
String s1="Ilove"; String s2="you"; String str8=s1+s2; System.out.println(str8=="Iloveyou"); //不相等,s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象,str6指向新开辟的堆区 //从而与常量池中的Iloveyou不同
String str9="Iloveyou".substring(0,2); System.out.println(str9=="Il"); //不相等,"Iloveyou".substring(0,2)会生成一个新的String对象,然后str9指向它,而非常量池中。
String str10="Iloveyou".toUpperCase(); System.out.println(str9=="ILOVEYOU"); //不相等,"Iloveyou".toUpperCase()会生成一个新的String对象,然后str9指向它,而非常量池中。