java String常見十大問題

Technorati 標記: String, java

1、如何判斷兩個String是否相等??使用」==「仍是使用」equals()「?

    對String來講,」==「是用來判斷兩個字符串(對象)的地址是否相同,即判斷是不是同一個字符串的應用。」equals()「則是判斷兩個字符串(對象)的值是否相等,若是相等則返回true。通常狀況下,都是使用」equals()「來判斷兩個字符串的值是否相等,只有當你須要判斷兩個字符串是不是同一個對象時,才使用」==「。java

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);	//true
System.out.println(str1 == str3);	//false
System.out.println(str1.equals(str3));	//true

    須要瞭解更多關於java內存管理分配的,能夠點擊 這裏正則表達式

2、如何實現String與基本數據類型的裝

    首先了解一下如何將String轉換爲基本的數據類型。8個wrapper class(Integer,Double….)提供了相對應的方法parseXxx(String str)將字符串轉換爲基本的數據類型,以下:數組

String str1 = "123";
String str2 = "12.3";
String str3 = "true";
int a = Integer.parseInt(str1);	//123
double d = Double.parseDouble(str2);	//12.3
boolean flag = Boolean.parseBoolean(str3);	//true

    也許會見過使用valueOf()的轉換,以下:安全

String str1 = "123";
String str2 = "12.3";
String str3 = "true";
int a = Integer.valueOf(str1);	//123
double d = Double.valueOf(str2);	//12.3
boolean flag = Boolean.valueOf(str3);	//true

    這種形式也行,只不過沒有直接使用parseXxx()好,由於Integer.valueOf()返回的是Integer類型,再經過自動集裝箱轉換爲基本數據類型,其方法原型以下:app

public static Integer valueOf(String s)

    注意的是,方法Boolean.parseBoolean(String str),只有在str爲字符串「true」時(忽略大小寫),纔會返回true。換句話說就是其餘字符串都是返回false。Boolean.parseBoolean(「yes」)將返回false。接着下來看一下如何將基本數據類型轉換爲String,可使用String.valueOf()方法進行轉換,以下:ide

int a = 123;
double b = 13.05;
boolean flag = true;
String str1 = String.valueOf(a);	//123
String str2 = String.valueOf(b);	//13.05
String str3 = String.valueOf(flag);	//true


    同時還有着更爲簡單快捷的方式,直接在基本數據類型以後添加「 」,以下;ui

String str1 = a +"";	//a
String str2 = flag + "";	//true


    最後談一下wrapper class的轉換,一樣能夠將基本數據類型轉換爲String,以下:spa

int a = 123;
boolean flag = true;
String str1 = Integer.toString(a);	//123
String str2 = Boolean.toString(flag);	//true

    事實上,String.valueOf()方法也是調用了各類wrapper  class的toString()方法,以下。只不過String.valueOf()用起來會方便一點,由於不須要去判斷數據屬於哪種類型。.net

public static String valueOf(double d) {
	return Double.toString(d);//其他的轉換都與之相似
    }

 

3、如何分割字符串

    在java裏分割字符串是經過正則表達式來分割的,在此我只是簡單談論一下如何分割,想深刻了解正則表達式的,能夠點擊 這裏線程

    首先看一個簡單的例子,以下使用「-」來分割字符串,

String str = "aa-bb-cc-dd";
String[] res = str.split("-");	//aa bb cc dd


    看起來很簡單,只須要在找出分割復就好了,如你想使用「c」做爲分割符,那輸出就是aa-bb-  -dd。另外再看一下,使用空格符(\s)來分割字符串(Space鍵,tab鍵或者換行符),以下:

String str4 = "aa bb cc dd";
String[] res = str4.split("\\s");	//aa bb cc dd

    在這裏就有點不一樣的,在java裏反斜線(\)有着特別的含義,爲避免混淆或者出現異常, 應該使用(\\),相似的,看一下使用「|」分割字符串,

String str4 = "aa|bb|cc|dd";
String[] res = str4.split("\\|");	//aa bb cc dd

4、取子串

String str = "abcdefg";
str = str.substring(2, 5);	//cde

 

    在java7裏,substring會建立一個字符串,若是是在java6,倡導使用以下方式:

String str = "abcdefg";
str = str.substring(2, 5)+"";	//cde

    關於substring在java6和java7的區別,能夠查閱相關文檔。

5、如何將字符串轉換日期

String str = "2013-9-24";
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern("yyyy-MM-dd");
Date date = format.parse(str);
System.out.println(date);
//Tue Sep 24 00:00:00 CST 2013

6、String,StringBuilder,StringBuffer的區別

    String與StringBuilder的區別,String是建立以後不能夠再修改,StringBuilder是可變的,建立以後能夠修改。StringBuilder與StringBuffer的區別,StringBuffer是線程安全的,執行速度相對StringBuffer會慢一點。

7、在switch語句中使用字符串

    從java7開始,能夠在switch語句中使用字符串,以下:

switch (str) {
	case "a":
				
		break;
	
	case "b":
				
		break;
}

8、讓字符串重複出現

    使用Apache Commons Lang的StringUtils,能夠實現這一功能:

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

其實現方式以下,注意,因爲篇幅緣由,並無考慮任何異常,詳細操做能夠參考源碼:

public String repeat(String str,int repeatTimes){
		int inputLen = str.length();	//獲取字符串的長度
		int outputLen = inputLen * repeatTimes;	//輸出字符串的長度
		switch (inputLen) {
		//當長度只有1或2時,選擇直接使用字符操做,增長效率
		case 1:
			return repeat(str.charAt(0), repeatTimes);
		case 2:
			char ch0 = str.charAt(0);
			char ch1 = str.charAt(1);
			char[] output = new char[outputLen];
			for(int i = repeatTimes * 2 -1;i >=0;){
				output[i] = ch0;
				output[i+1] = ch1;
				i +=2;
			}
			return output.toString();
		default:
			StringBuilder buf = new StringBuilder();
			for(int i = 0;i <= repeatTimes - 1; i++){
				buf.append(str);
			}
			return buf.toString();
		}
	}
	
	public String repeat(char ch,int repeatTimes){
		char[] buf = new char[repeatTimes];
		for(int i = repeatTimes-1; i >= 0; i--){
			//複製repeatTimes
			buf[i] = ch;
		}
		
		return buf.toString();
	}


9、如何計算指定字符在字符串裏出現的次數

    一樣是使用Apache Commons Lang的StringUtils,以下:

int n = StringUtils.countMatches("aaaabbbb", "a");
System.out.println(n);

 

    源碼研究不透,不太會其實現方式.若是你知道的,但願你能夠分享一下,萬分感謝.

十.在一些敏感信息上,爲何傾向用char[],而不是String?

    當String一旦建立,便不可再修改,直到gc將它回收.可gc的回收時間沒法預測.即便一個對象不存在引用,也須要在將來的某個時間纔會讓給出回收.因此String操做敏感信息,有滲漏的風險.可char[]就不同了,咱們能夠經過程序直接控制其元素,通常敏感信息再也不有用,直接將數組便可,所以更傾向使用char[]來保存密碼等敏感信息.

相關文章
相關標籤/搜索