Java中String的簡單理解

帶着一些問題簡單看一下

1. String存在堆上還是常量池?

2. a = "hello", b= new String("hello"), c = "hello"

         c == a 嗎?  c == b 嗎?  a.hashCode == b. hashCode嗎?

3. 怎麼理解String是不可變的?

 

import org.junit.Test;

/**
 * @author zhanjp
 * @DATE 2020/1/1
 */
public class TestSimple {

    @Test
    public void testString (){
        
        // case1. new String()構造的字符串hashcode相同,內存地址不同
        String s1 = "hello";
        String s2 = new String("hello");
        // Object 默認的hashCode返回的是對象的內存地址,
        // 而string改寫了hashCode,所以hashCode是一樣的
        assert s1.hashCode() == s2.hashCode(); // true
        assert s1 == s2; //對比內存地址 false
        
        // case2. 再建一個s3, 它會和誰相等?s3 和 s1 是同一個引用
        String s3 = "hello";
        assert s1 == s3; // true
        assert s2 == s3; // false

        // 總結,s1 和 s3 指向的是常量池中的hello, 而s2指向的是java堆上另一個hello
        
        // case3. 怎麼理解String是不可變的?
        // s1 + "world!",s1就指向了一個新的字符串!
        s1 += " world!";
        assert s1 == s3; //false, 因爲s1指向了新的內存地址
        
        
    }
}

 

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