Java使用字符串的幾個常見問題

今天上班的時候發現有人使用==來比較空串"",本人一直都是使用equals來比較的,因此特地上網查詢了一下,有部份內容借鑑網上的blog。

如下列舉10個比較常見的Java字符串問題。

1. 如何比較字符串,是使用「==」仍是使用equals()?

簡單的說,==比較字符串是否引用同一地址,而equals()比較值是否相等。除非須要檢查兩個字符串是不是同一個對象,不然應該老是使用equals()方法。

(1) 使用==判斷字符串請注意如下五種狀況:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true
  Java對字符串常量提供了緩衝區,緩衝區內的字符串是能夠被共享的。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);  // false

  使用構造器建立的字符串都是在緩衝區外面建一個新的。 java

String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4); // false

  Java中字符串的相加其內部是使用StringBuilder類的append()方法和toString()方法來實現的. 而StringBuilder類toString()方法返回的字符串是經過構造函數建立的. 正則表達式

String s1 = "abc";
String s2 = "a" + "bc";
System.out.println(s1 == s2); // true
   其實這裏的s2並無進行字符串相加, 兩個雙引號形式的字符串常量相加, 在編譯的時候直接會被轉爲一個字符串"abc".
String str = "abc";
str.substring(3);
str.concat("123");
System.out.println(str == "abc"); // true

  因爲字符串是常量(內存中建立對象後不能修改), 該類中全部方法都不會改變字符串的值. 若是但願使用一個可變的字符串, 可使用StringBuilder或StringBuffer類. apache


(2) Java判斷字符串是否爲空有三種方法:
a. 使用的人最多,直觀方便,可是效率低。 數組

if (str == null || str.equals(""))

b. 比較字符串的長度,效率高
安全

if (str == null || str.length() == 0)
c. Java SE 6.0纔開始使用,效率和b才很少
if (str == null || str.isEmpty())

2. 
爲何爲在處理私密信息的時候,選擇char [ ]比String好?

String是不可改變的。這意味着一旦String對象被建立,那個地址上的值將保持不變,直到垃圾收集器有空來作自動清理。而使用char[ ]能夠(在用完後)明確地修改它的元素。這種一來,私密信息(例如密碼)就不會在系統的任何地方出現。

3. 咱們能夠在switch語句中用String做分支條件嗎?

從JDK 7開始是能夠的。咱們可使用String符串做爲Switch條件。第JDK 6以前,咱們不能使用String做爲Switch條件。

4. 如何轉換String爲int?
app

int n = Integer.parseInt("10");

5. 如何用空白符分割字符串?

能夠簡單地使用正則表達式作分割。「\s"表明全部空格符,如""、 " \ "、 " \ r"、" \ n "。 函數

String[] strArray = aString.split("\\s+");

6. Substring() 具體幹了些什麼?

在JDK 6中,substring() 提供了一個顯示已有字符串char[]的接口,但不建立新字符串。若是須要建立一個新的char[]表示的字符串,能夠像下面同樣與一個空字符串相加: ui

str.substring(m, n) + "";

這樣會建立一個新的字符數組,表示新的字符串。示例方法有時可使代碼運行更快,由於垃圾收集器能夠收集未使用的大字符串只保留子串。

在Oracle JDK 7中 ,substring()會建立一個新的字符數組而不是使用現有的。

7. String vs StringBuilder vs StringBuffer spa

String 與StringBuilder的區別:StringBuilder的是可變的,這意味着能夠在建立之後再做修改。
StringBuilder與StringBuffer的區別: StringBuffer的是同步的,這意味着它是線程安全的,但速度比StringBuilder慢。

8. 如何重複一個字符串?

在Java中,咱們可使用Apache公共語言包(Apache Commons Lang package)中的repeat()。
線程

String str ="abcd";
String repeated = StringUtils.repeat(str,3); //abcdabcdabcd

9. 如何轉換字符串爲日期?

String str ="Sep 17, 2013";
Date date = null;
try {
  date =new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);
} catch (ParseException e) {
  e.printStackTrace();
}
System.out.println(date); // Tue Sep 17 00:00:00 CST 2013

10. 如何統計某字符在一個字符串中的出現次數?
使用apache公共語言包中的StringUtils:

int n = StringUtils.countMatches("11112222","1");
System.out.println(n);
相關文章
相關標籤/搜索