带着一些问题简单看一下
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指向了新的内存地址
}
}