結論:new String(xxx)會在內存中產生一個新的字符串,即使該字符串已經存在於常量池中,也不會引用已經存在的字符串,會重新生成一個新的字符串,而且重新生成的這個字符串也是不可被引用的(比如,先String a = new String("test"); 再 b = "test",這時,b並不會引用a的值,a和b是不同的,使用==比較結果爲false。);string = xxx,如果常量池中存在這個字符串,那麼不會產生新的字符串,會引用已經存在的字符串,如果常量池中沒有,則會在常量池中生成一個。調用了intern()方法的字符串,後續的字符串可以引用該值(比如,先b = "test",再String a = new String("test"); 這時a==b爲true)。
下面是測試用代碼:
package com.alice.springboot.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.text.SimpleDateFormat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestClass {
@Test
public void Test()
{
}
public static void main(String[] args)
{
SimpleDateFormat test = new SimpleDateFormat("yyyy-MM-dd");
try {
String s1 = "test";
String s2 = "test";
System.out.println("s1和s2是同一個字符串" + (s1 == s2));//true
String s3 = new String("test");
System.out.println("s1和s3是同一個字符串" + (s1 == s3));//false
String s4 = "tes" + "t";
System.out.println("s1和s4是同一個字符串" + (s1 == s4));//true
System.out.println("s3和s4是同一個字符串" + (s3 == s4));//false
String s5 = new String("test");
System.out.println("s1和s5是同一個字符串" + (s1 == s5));//false
System.out.println("s3和s5是同一個字符串" + (s3 == s5));//false
String s6 = s3.intern();
System.out.println("s1和s6是同一個字符串" + (s1 == s6));//true
System.out.println("s3和s6是同一個字符串" + (s3 == s6));//false
String s7 = "test";
System.out.println("s1和s7是同一個字符串" + (s1 == s7));//true
System.out.println("s3和s7是同一個字符串" + (s3 == s7));//false
System.out.println("s6和s7是同一個字符串" + (s6 == s7));//true
String s8 = new String("add");
String s9 = "add";
System.out.println("s8和s9是同一個字符串" + (s8 == s9));//false
String s10 = new String("delete").intern();
String s11 = "delete";
System.out.println("s10和s11是同一個字符串" + (s10 == s11));//true
s1.trim();
} catch (Exception e) {
e.printStackTrace();
}
}
}
下面是運行結果: