写了有关String创建的一系列的问题,总结为:(假设字符串常量池为空)
● 使用String s=new String(“abc”),如果常量池没有,则在堆和常量池创建对象,最后指向堆
● 直接赋值String s=“abc”,只在常量池创建,栈中放引用,堆中没有创建对象,最后指向常量池。
● 使用String s=new String(“ab”)+"c"拼接,则在池中创建new的字符串和赋值的字符串,最后指向堆
● 使用String s=“ab”+"c"拼接,在池中创建拼接好的字符串“abc”,最后指向常量池
下面是测试详细的过程:
public class StringTest {
@Test
public void StringInfo() {
String s1 = new String("abc");
String s2 = "abc";
String s3 = new String("abc");
String s4 = "abc";
//s1和s2不同,因为s1会同时在堆和字符串常量池中创建对象,s1中存到是指向堆中“abc"的引用,s2存的是指向字符串常量池中的引用
System.out.println(s1 == s2); //false
//s1和s3也不同,因为显示的使用了new,肯定会在堆里新建一个“abc”,字符串常量池中已经有“abc”了,就不会再创建了,但是s3会指向堆里新创建的“abc”
System.out.println(s1 == s3); //false
//s2和s3不同,因为虽然字符串常量池中有了“abc”,但是s3使用了new,所以会在堆里创建对象,并指向堆。
System.out.println(s2 == s3); //false
//s2和s4相同,他们没有使用new,都指向字符串常量池中的“abc”
System.out.println(s2 == s4); //true
System.out.println("----------------------------------");
//进一步的
System.