先來一道java面試題:
String s = new String(“zsx”);
問:創建了幾個String Object?
先別往下看,想想答案
先上一個圖:
如圖所示,問題所示的語句創建了2個String對象和一個引用。
String s = new String(“zsx”);
相當于
String s1=”zsx”;
String s=new String(s1);
“zsx”作為一個常量字符串首先被創建,它被保存在“串池”中。
所謂串池,簡單講就是從程序運行開始,你創建的所有常量字符串被統一保存的地方。在串池中已經存在”zsx”這個串的情況下,如果你需要一個內容相同的串,你不需要再次創建一個,而是直接用這個就可以,這樣當然是為了節省空間。(注意,一個字符串是無法被修改的,所以在程序的不同地方用不同變量引用同一個常量串沒有任何危險,因為你只能讀取它而不能修改它。)
然后,new String(“zsx”)也創建了一個對象,”zsx”作為傳入構造方法的實際參數,其含義就是:我要創建一個串,它的內容和串池中的”zsx”內容一致!
前兩步建立的對象都是保存在堆heap上的。
最后String s = new String(“zsx”); 所做的工作是:在棧stack中創建一個引用s,然后s指向上一步new出的對象所在地。結束。
我一直覺得String的內容簡單的很,我早就掌握了。直到看到這題,我知道我以前真是too young,too naive。知其然而不知其所以然,謂之“菜鳥”也。
知道真相的我立馬滾去學習,現將所獲記錄如下:
- String的兩種創建方式
- String的常用方法
- StringBuffer、StringBuilder
- String與StringBuffer的對比
- 自己實現String的一些常用方法
2015/8/3 17:09添加:
java里是沒有運算符重載的,String+是StringBuffer的append()方法來實現的,如:
請把下面的程序編譯后再反編譯:
String a = “a”;
String b = “b”;
String c = a + b;
String d = c + 1;
得到的結果是:
String a = “a”;
String b = “b”;
String c = (new StringBuilder(String.valueOf(a))).append(b).toString();
String d = (new StringBuilder(String.valueOf(c))).append(1).toString();
所以,重載的是 append() 方法。
轉載于:https://blog.51cto.com/13545923/2053483