帶着一些問題簡單看一下
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指向了新的內存地址
}
}