Java基礎--5字符串

子串

  String類的substring方法可以從一個較大的字符串提取出一個子串。

拼接

  Java允許使用 + 號連接兩個字符串。
  當將一個字符串和一個非字符串進行拼接時,後者被轉換爲字符串。(任何一個Java對象都可以轉換成字符串)

不可變字符串

  String類對象稱爲不可變字符串。
  String類沒有提供用於修改字符串的方法。如果需要修改,可以先提取需要的字符,然後再拼接上替換的字符串。
  誠然,通過拼接來創建一個新字符串的效率確實不高。但是,它卻有一個有點:編譯器可以讓字符串共享。·

檢測字符串是否相等

  可以使用equals方法檢測是否相等。
  想要不區分大小寫檢測兩個字符串是否相等,可以使用equalsIsIgnoreCase方法。
  一定不能使用 == 運算符檢測兩個字符串是否相等。這個運算符只能夠確定兩個字符串是否放置在同一個位置上。因爲完全有可能將內容相同的多個字符串放在不同的位置上。
  注:如果虛擬機始終將相同的字符串共享,就可以使用 == 運算符檢測是否相等。但實際上只有字符串常量是共享的,而 + 或 substring 等操作產生的結果並不是共享的。因此,千萬不要用 == 運算符測試字符串的相等性,以免出現糟糕的bug。

空串與Null串

  空串”“是長度爲0的字符串。
  Null串表示目前沒有任何對象與該變量關聯。
  很多時候要檢查一個字符串既不是null也不爲空串,我們首先要檢查str不爲null。如果我們在一個null值上調用方法,會出現錯誤。

難點:代碼點與代碼單元

  Java字符串由char序列組成。char數據數據類型是一個採用UTD-16編碼表示Unicode代碼點的代碼單元。大多數常用的Unicode字符使用一個代碼單元就可以表示,而輔助字符需要一對代碼單元表示。
  length方法返回採用UTF-16編碼表示的給定字符串所需要的代碼單元數量。例如:

String greeting = "Hello";
int n = greeting.length();  // is 5.

  想要得到實際的長度,即代碼點數量,可以調用:

int cpCount = greeting.codePointCount(0, greeting.length());

  想得到第i個代碼點,應該使用下列語句:

int index = greeting.offsetByCodePoiint(0, i);
int cp = greeting.codePointAt(index);


  爲什麼會對代碼單元如此大驚小怪?請考慮下列語句:
  Ƶ is the set of integers
  使用UTF-16編碼表示Ƶ需要兩個代碼單元。調用
  char ch = sentence.charAt(1)
  返回的不是空格,而是第二個代碼單元Ƶ。爲了避免這種情況的發生,請不要使用char類,這太低級了。

  如果想要遍歷一個字符串,並且依次査看每一個代碼點,可以使用下列語句:

int cp = sentence.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp)){
i += 2;
} else {
i++;
}

  codePointAt方法能夠辨別一個代碼單元是輔助字符的第一部分還是第二部分,並能夠返回正確的結果。
  可以用下列語句實現回退操作:

i--;
if(Character.isSurrogate(sentence.charAt(i))) {
i--;
}
int cp = sentence.codePointAt(i);


構建字符串

  每次連接字符串,都會構建一個新的String對象,既耗時,又浪費空間。而使用StringBuilder類就可以避免這個問題的發生。

StringBuilder builder = new StringBuilder();

  每次需要添加一部分內容時,就調用append方法:

builder.append(ch);//appends a single character
bulider.append(str);//appends a string

  在需要構建字符串時就調用toString方法,將可以得到一個String對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章