共创建了几个String对象
1.例子
Test.java
package TestObject;
public class Test {
public static void main(String[] args) {
function1();
function2();
function3();
function4();
}
public static void function1() {
System.out.println("----------------------function1----------------------");
String s1 = "a";//创建一个
String s2 = new String("a");//创建两个
System.out.println(s1 == s2);
}
public static void function2() {
System.out.println("----------------------function2----------------------");
String s1 = "a" + "b";//创建一个
String s2 = "ab";//不再创建
String s3 = "a";//创建一个
String s4 = s3 + "b";//创建一个
System.out.println(s1 == s2);
System.out.println(s1 == s4);
}
public static void function3() {
System.out.println("----------------------function3----------------------");
String a = "a";//创建一个
String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//创建一个
System.out.println(s1 == s2);
}
public static void function4() {
System.out.println("----------------------function4----------------------");
final String a = "a";//创建一个
final String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//不再创建
String s3 = "ab";//不再创建
System.out.println(s1 == s2);
System.out.println(s1 == s3);
}
}
运行结果
反编译工具查看Test.class
2.分析
2.1 function1
String s1 = "a";
在常量池中创建了一个字符串对象。
String s2 = new String("a");
在常量池中创建了一个字符串对象"a",在堆中开辟了一个空间又放了一个"a"。
2.2 function2
String s1 = "a" + "b";//创建一个
String s2 = "ab";//不再创建
在编译期,jvm将"a"+“b"自动识别成"ab”。
2.3 function3
String a = "a";//创建一个
String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//创建一个
第三和第四行,各创建了一个对象,因为对于编译器来说,创建s1和s2时候,a和b的值被当做是不确定的,所以各自开辟空间创建对象。
2.4 function4
final String a = "a";//创建一个
final String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//不再创建
String s3 = "ab";//不再创建
在String前边加个final,后边再用这个对象的时候,对编译器来说a的值是确定的,和"a"是一个东西都是“字面常量字符串”。