new String(xx)和string = xxx的区别

结论: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();
        }
    }
}

下面是运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章