string创建的过程可分为两步,在字符串常量池中创建和在队中创建
String temp = "hello"; // 在常量池中 String str = new String(temp); // 在堆上
如果再次创建同一个string,堆中会创建一个新的str2对象,但是它指向的仍然是常量池中的对象,此时只创建了一个对象。
String str2 = new String("hello");
对比以下情况,此情景下创建str5和str6时分别创建了多少个对象?
String str4 = "bc"; String str5 = "a"+str4; String str6 = "a" + "bc";
str5为两个,str6为1个,原因是str6创建的语句会被编译器优化为
String str6 = "abc";
由于先前已经在常量池中创建了字符串"abc",所以只需要创建一个堆中的对象,而str5使用了str4,无法优化,因此还需要再在常量池中创建一个"a"。