天天看點

你真的了解JAVA裡的String麼

1. String str1 = "abc";

System.out.println(str1 == "abc");

步驟:

1) 棧中開辟一塊空間存放引用str1,

2) String池中開辟一塊空間,存放String常量"abc",

3) 引用str1指向池中String常量"abc",

4) str1所指代的位址即常量"abc"所在位址,輸出為true

2. String str2 = new String("abc");

System.out.println(str2 == "abc");

步驟:

1) 棧中開辟一塊空間存放引用str2,

2) 堆中開辟一塊空間存放一個建立的String對象"abc",

3) 引用str2指向堆中的建立的String對象"abc",

4) str2所指代的對象位址為堆中位址,而常量"abc"位址在池中,輸出為false

3. String str3 = new String("abc");

System.out.println(str3 == str2);

步驟:

1) 棧中開辟一塊空間存放引用str3,

2) 堆中開辟一塊新空間存放另外一個(不同于str2所指)建立的String對象,

3) 引用str3指向另外建立的那個String對象

4) str3和str2指向堆中不同的String對象,位址也不相同,輸出為false

4. String str4 = "a" + "b";

System.out.println(str4 == "ab");

步驟:

1) 棧中開辟一塊空間存放引用str4,

2) 根據編譯器合并已知量的優化功能,池中開辟一塊空間,存放合并後的String常量"ab",

3) 引用str4指向池中常量"ab",

4) str4所指即池中常量"ab",輸出為true

5. final String s = "a";

String str5 = s + "b";

System.out.println(str5 == "ab");

步驟:

同4

6. String s1 = "a";

String s2 = "b";

String str6 = s1 + s2;

System.out.println(str6 == "ab");

步驟:

1) 棧中開辟一塊中間存放引用s1,s1指向池中String常量"a",

2) 棧中開辟一塊中間存放引用s2,s2指向池中String常量"b",

3) 棧中開辟一塊中間存放引用str5,

4) s1 + s2通過StringBuilder的最後一步toString()方法還原一個新的String對象"ab",是以堆中開辟一塊空間存放此對象,

5) 引用str6指向堆中(s1 + s2)所還原的新String對象,

6) str6指向的對象在堆中,而常量"ab"在池中,輸出為false

7. String str7 = "abc".substring(0, 2);

步驟:

1) 棧中開辟一塊空間存放引用str7,

2) substring()方法還原一個新的String對象"ab"(不同于str6所指),堆中開辟一塊空間存放此對象,

3) 引用str7指向堆中的新String對象,

8. String str8 = "abc".toUpperCase();

步驟:

1) 棧中開辟一塊空間存放引用str6,

2) toUpperCase()方法還原一個新的String對象"ABC",池中并未開辟新的空間存放String常量"ABC",

3) 引用str8指向堆中的新String對象