final 和 String
public static void main(String[] args) { String a1 = "a"; String a2 = "b"; // 非final串相加,指向堆中new的对象 String a3 = a1+a2; String a4 = "ab"; String a5 = new String("ab"); System.out.println("a3==a4?"+(a3==a4));//false System.out.println("a3==a5?"+(a3==a5));//false System.out.println("a4==a5?"+(a4==a5));//false // final串相加,直接指向常量池中存在的 final String a6 = "a"; final String a7 = "b"; String a8 = a6+a7; System.out.println("a3==a8?"+(a3==a8));//false System.out.println("a4==a8?"+(a4==a8));//true System.out.println("a5==a8?"+(a5==a8));//false }
intern方法
s3.intern()在 Stirng s4 = "11"之前
public static void main(String[] args) { String s3 = new String("1") + new String("1"); s3.intern(); String s4 = "11"; System.out.println(s3 == s4);// s3.intern()在 s4创建之前 true }
s3.intern()在 Stirng s4 = "11"之后
public static void main(String[] args) { String s3 = new String("1") + new String("1"); String s4 = "11"; s3.intern(); System.out.println(s3 == s4);// s3.intern()在 s4创建之后 false }
直接new String("11") 也返回false
public static void main(String[] args) { String s3 = new String("11"); s3.intern(); String s4 = "11"; System.out.println(s3 == s4);// false }
猜想:s3 = new String("1")+ new String("1");时常量池中不存在"11"
所以调用s3.intern()使得,s3指向了常量池。
如果s3 = new String("11")那么常量池中会创建一个"11"则,调用s3.intern()不起作用s3还是指向new String("11")。
或者s3 = new String("1")+ new String("1");s4 = "11"则,常量池中还是有"11"所以数s3.intern()不起作用