天天看點

Java String 十大常見問題

1.字元串比較,使用“==”還是equals()?

  "=="判斷兩個引用的是不是同一個記憶體位址(同一個實體對象)。

  equals()判斷兩個字元串的值是否相等。

  除非你想判斷兩個string引用是否同一個對象,否則應該總是使用equals()方法。

  如果你了解字元串的駐留(string interning)則會更好地了解這個問題。

  2. 對于敏感資訊,為何使用char[]要比string更好?

  string是不可變對象,意思是一旦建立,那麼整個對象就不可以改變,即使新手覺得string引用變了,實際上隻是(指針)引用指向了另一個(新的)對象。

  而程式員可以明确地對字元數組進行修改,是以敏感資訊(如密碼)不容易在其他地方暴露(隻要你用完後對char[]置0).

  3.在switch語句中使用string作為case條件

  // 隻在java 7及更高版本有效!

switch (str.tolowercase()) {

case "a":

value = 1;

break;

case "b":

value = 2;

}

  4.轉換string為數字

  對于非常大的數字請使用long.代碼如下:

  int age = integer.parseint("10");

  long id = long.parselong("190"); // 假如值可能很大.

  5.如何通過空白符拆分字元串

  string的split()方法接收的字元串會被當做正規表達式解析。

  "\s"代表空白字元,如空格"",tab制表符"\t",換行"\n",回車"\r".

  而編譯器在對源代碼解析時,也會進行一次字面轉碼。是以需要"\\s".

  string[] strarray = astring.split("\\s+");

  6.substring()方法内部是如何處理的?

  在jdk6中,substring()方法還是共用原來的char[]數組,通過偏移和長度構造了一個"新"的string.

  想要substring取得一個全新建立的對象,使用如下這種方式:

  string sub = str.substring(start, end) + "";

  當然java 7中,substring()建立了一個新的char[]數組,而不是共用。想了解更多,請參考:jdk6和jdk7中string的substring()方法及其差異

  7.string vs stringbuffer vs stringbuilder

  stringbuilder是可變的,是以可以在建立以後修改内部的值。

  stringbuffer是同步的,是以是線程安全的,但是效率相對更低。

8.如何重複拼接同一個字元串?

  方案一:使用apache commons lang庫的stringutils工具類。

  string str = "abcd";

  string repeated = stringutils.repeat(str,3);//abcdabcdabcd

  方案二:使用stringbuilder構造,更靈活。

string src = "name";

int len = src.length();

int repeat = 5;

stringbuilder builder = new stringbuilder(len * repeat);

for(int i=0; i<repeat; i++){

builder.append(src);

string dst = builder.tostring();

  9.如何将string轉換成日期?

  simpledateformat format = new simpledateformat("yyyy-mm-dd");

  string str = "2013-11-07";

  date date = format.parse(str);

  system.out.println(format.format(date));//2013-11-07

  10.如何統計某個字元出現的次數?

  同樣使用apache commons lang 庫stringutils類:

  int n = stringutils.countmatches("11112222", "1");

  system.out.println(n);

最新内容請見作者的github頁:http://qaseven.github.io/