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

下面是運行結果:

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