問:執行這一語句,一共創建了幾個String對象?
答:2個,1個在String池中,一個在堆內存中。
但其實這題目具有很大的靈活度,如果不真正理解String的運作機制,換個樣子就有可能把PAPER難住了。
String s1 = "xyz"; String s2 = "x"+"yz"; String s3 = "x"+new String("yz"); String s4=new String("xyz");
如果說s1==s2,那s1為什么!=s3呢?為什么s1!=s4呢?
String類是java中一個比較特殊的類,與其相關的還有java中僅有的兩個內置重載操作符:"+"和"+="。
String類對象是不可變的,而StringBuffer & String Builder類對象是可變的;String類重寫了equals方法,而StringBuffer & String Builder類卻沒有重寫。
拿操作符"+"來說,其兩邊的操作元類型無非就5種情況(注意操作符的左結合性):
1、兩個操作元都是基本類型(原始類型):效果是重載前的算術運算
2、兩個操作元都是非String類型的引用類型:編譯無法通過,不支持
3、兩個操作元都是String類型:重載操作
4、一個是String類型,一個是基本類型:重載操作
5、一個是String類型,一個是引用類型:重載操作
其實對于3、4兩種情況,由于String類型的特殊性,編譯器會在編譯時做一些特殊處理,所以情況會變得稍微復雜一點。
1
public class StringTest
2
{
3
public static void main(String[] args)
4
{
5
//1.操作符兩邊都是基本類型(原始類型),則"+"操作符代表算術運算
6
//2.操作符兩邊都是非String類型的引用類型,重載操作不支持,編譯錯誤
7
//3.操作符兩邊都是String類型
8
String s1 = new String("hello");
9
String s2 = new String("world");
10
String s3 = s1+s2; //重載操作是通過StringBuilder實現的
11
12
//4.操作符一邊是基本類型(原始類型)
13
int i = 2008;
14
String s4 = new String("beijing");
15
String s5 = s4+i; //重載操作是通過StringBuilder實現的,
16
//對于基本類型也并不是轉化成String字符串再進行連接
17
18
//5.操作符一邊是引用類型
19
Integer in = new Integer(2008);
20
String s6 = s4+in; //重載操作是通過StringBuilder實現的,
21
//對于引用類型in,通過in.toString()方法返回字符串,再進行連接
22
23
//6.操作符都是String類型,且都是編譯時可計算的
24
String s7 = "hello"+"world"; //編譯后就確定了s7取值,并不需要等到運行時
25
System.out.println(s3==s7); //false, s3指向StringBuilder返回的,指向堆內存的新String對象,s7則指向String池
26
27
//7.操作符一邊是基本類型(原始類型)
28
String s8 = "beijing"+2008; //編譯后就確定了s8取值,并不需要等到運行時
29
System.out.println(s5==s8); //false, s5指向StringBuilder返回的,指向堆內存的新String對象,s8則指向String池
30
31
String s9 = "beijing"+i; //編譯時無法計算出取值,s9的結果是指向堆內存
32
System.out.println(s8==s9); //false, s9指向的是堆內存,而s8指向String池
33
s7 += " blogjava"; //編譯時無法計算出取值,s7的結果是指向堆內存
34
System.out.println(s7=="helloworld blogjava".intern()); //false, s7指向的是堆內存
35
}
36
}
37

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

查看反編譯后的源代碼或許更能理解String的運作機制:






















































































































