结论: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").intern(); 这时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();
}
}
}
下面是运行结果: