String的知识点
-
String是不可变类, 即一旦一个String对象被创建, 包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。
-
String类是final类,不能有子类。
-
常量池概念:Java运行时会维护一个常量池, 常量池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。
public static void main(String[] args){ String s1="cf";//创建了一个对象 System.out.println(s1.hashCode());// s1="cs";//s1的地址已经发生了变化 System.out.println(s1.hashCode());// String s11="cf"+"cs"//创建了一个对象cfcs //----------------- String s2=new String("LOL");//创建了两个对象 Sting s3=new String("LOL");//只创建了一个对象,因为abcd上面已经创建了 Sting s4=new String("lol");//创建了两个对象 //------------------------------------------------------------------ String str1 = "abc"; //引用类型比较的是地址 String str2 = "abc"; System.out.println(str1 == str2);//t 字符串常量池的地址不变 System.out.println("-----------------"); String str21 = new String("abc"); String str22 = new String("abc"); System.out.println(str21 == str22);//f 这里比较的是两个对象new String()地址 System.out.println("-----------------"); String str31 = "ab" + "cd"; // 1个对象 String str32 = "abcd"; System.out.println(str31 == str32);//t 还是比较字符串常量池里面的地址 System.out.println("-----------------"); String str41 = "ab"; // 1个对象 String str42 = "cd"; // 1个对象 String str43 = str41 + str42; String str44 = "abcd"; System.out.println(str43 == str44); //false str41和str42为变量,在运行期才会被解析。 System.out.println("-----------------"); String str51 = "b"; String str52 = "a" + str51; String str53 = "ab"; System.out.println(str52 == str53);//f str51为变量,在运行期才会被解析。 System.out.println("-----------------"); final String str61 = "b"; String str62 = "a" + str61; String str63 = "ab"; System.out.println(str62 == str63);//t str61为常量变量,编译期会被优化 }
示意图: