標籤:
這是學習中用到的一些基礎知識
String 是經常會用到的一個類,學習的過程中發現的東西進行的匯總。
1. 初始化方面:
String類是一個比較特別的類,初始化的時候有種簡化的特殊文法。
1>String s = "abc";
而按照正規的文法來說,應該是:
2>String s = new String ("abc");
建議使用1>的方式,原因在於這樣比較節省記憶體空間,從其他網站上照抄下來的說法是,【只是按照物件導向的標準文法,在記憶體使用量上存在比較大的浪費。例如 String s = new String(“abc”);實際上建立了兩個String對象,一個是”abc”對象,儲存在常量空間中,一個是使用new關鍵字為對象s申請的空間。】
下面是簡單的代碼
1 String a = "abc";2 String b = "abc";3 System.out.println(a==b);
列印的結果是True。這裡的代碼含義在於,建立了String類型的引用變數,a和b,a和b指向了值為"abc"的String類,至於是不是建立的String類型的對象,需要根據代碼的前後文進行分析(因為JVM會自動根據棧中資料的實際情況來決定是否有必要建立新對象)。結果為True,代表這至少第二行代碼沒有重新建立一個String類型的對象,而是指向了存在的"abc"的對象,所以a 和 b 指向的是同一個對象,必然兩者是相等的。
再如下面的代碼:
1 String d = new String("abc");2 String e = new String("abc");3 System.out.println(d==e);
列印的結果是False,即 d, e兩個String類型的引用是指向不同的對象,1,2行代碼的處理邏輯是: 不管其字串值是否相等,是否有必要建立新對象,都會建立新的對象。
另外研究到這裡的時候,發現代碼1中,提出了一個設計模式的思想-享元模式,即複用記憶體中已經存在的對象,降低系統建立對象執行個體的效能消耗。至於更多的分析可能會隨著學習逐步的深入
2. String的唯讀特性
String是一個常量,在初始化的時候,一旦建立就不能再被改變,所以看起來是修改了String值的方法,其內部的邏輯並非如此。如下面的代碼:
1 String a1 = "first";2 System.out.println(a1 + ", second");
列印之後是“first, second”,其實內部邏輯上來看,其實是產生了一個新的String對象,而不是在原有的String對象上追加內容。
而java的內部處理方式上有說法是通過StringBuilder 這個類來實現字串的拼接。所以大膽假設下,以上的代碼等同於如下的實現方式:
1 StringBuilder stringBuilder = new StringBuilder();2 stringBuilder.append(a1);3 stringBuilder.append(", second");4 System.out.println(stringBuilder.tostring());
通過上面的代碼可以看出,如果假設是成立的情況下,在進行字串拼接的時候如果使用的“String + ”的方式進行的,而在java內部是通過StringBuilder的方式來實現的話,那會建立一個StringBuilder對象來處理,單個的情況下不會有太多額外消耗,但是如果在迴圈體中使用了“String +”的方式,會不斷進入迴圈的時候不端建立StringBuilder對象,這樣反倒是有增加記憶體開支的嫌疑。所以如果以上假設都成立的話,在使用到字串拼接的時候,乾脆使用StringBuilder 的方式不是更好嗎?省的轉換成StringBuilder的方式後還得在每次迴圈中不斷的建立StringBuilder對象。
3. equals 和 “==”的區別
簡單的說,String的 equals()方法比較字串對象中的字元, == 運算子比較的是兩個對象是否引用同一執行個體,代碼如下:
1 String s1 = "Hello";2 String s2 = new String(s1);3 System.out.println(s1.equals(s2)); //True 4 System.out.println(s1==s2); //False
這個代碼就比較簡單了,看下面是equals的實現方法
public boolean equals(Object anObject) { if (this == anObject) { //判斷是否同一對象 return true; } if (anObject instanceof String) { String anotherString = (String)anObject;//String類型 int n = count; //一個字元一個字元的比較 if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
從源碼中可以看得出比較的是字串中的字元是否完全相等。看源碼是個好習慣,要有耐心。
java中的String類的一點認識