<code id="qf3hh"></code>
  • <menuitem id="qf3hh"></menuitem>
  • <strike id="qf3hh"><label id="qf3hh"></label></strike>

  • ?
      開發(fā)技術(shù) / Technology

      java String常見十大問題

      日期:2015年2月9日  作者:zhjw  來源:互聯(lián)網(wǎng)    點擊:916

      Technorati 標(biāo)記: ,

      一、如何判斷兩個String是否相等??使用”==“還是使用”equals()“?

          對String來說,”==“是用來判斷兩個字符串(對象)的地址是否相同,即判斷是否是同一個字符串的應(yīng)用。”equals()“則是判斷兩個字符串(對象)的值是否相等,如果相等則返回true。一般情況下,都是使用”equals()“來判斷兩個字符串的值是否相等,只有當(dāng)你需要判斷兩個字符串是否是同一個對象時,才使用”==“。

      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

       

          需要了解更多關(guān)于java內(nèi)存管理分配的,可以點擊 這里。

      二、如何實現(xiàn)String與基本數(shù)據(jù)類型的裝換

          首先了解一下如何將String轉(zhuǎn)換為基本的數(shù)據(jù)類型。8個wrapper class(Integer,Double….)提供了相對應(yīng)的方法parseXxx(String str)將字符串轉(zhuǎn)換為基本的數(shù)據(jù)類型,如下:

      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()的轉(zhuǎn)換,如下:

      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類型,再通過自動集裝箱轉(zhuǎn)換為基本數(shù)據(jù)類型,其方法原型如下:

      public static Integer valueOf(String s)

       

          注意的是,方法Boolean.parseBoolean(String str),只有在str為字符串“true”時(忽略大小寫),才會返回true。換句話說就是其他字符串都是返回false。Boolean.parseBoolean(“yes”)將返回false。接著下來看一下如何將基本數(shù)據(jù)類型轉(zhuǎn)換為String,可以使用String.valueOf()方法進行轉(zhuǎn)換,如下:

      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


          同時還有著更為簡單快捷的方式,直接在基本數(shù)據(jù)類型之后添加“ ”,如下;

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


          最后談一下wrapper class的轉(zhuǎn)換,同樣可以將基本數(shù)據(jù)類型轉(zhuǎn)換為String,如下:

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

          事實上,String.valueOf()方法也是調(diào)用了各種wrapper  class的toString()方法,如下。只不過String.valueOf()用起來會方便一點,因為不需要去判斷數(shù)據(jù)屬于哪一種類型。

      public static String valueOf(double d) {
      	return Double.toString(d);//其余的轉(zhuǎn)換都與之類似
          }

       

      三、如何分割字符串

          在java里分割字符串是通過正則表達式來分割的,在此我只是簡單談?wù)撘幌氯绾畏指?,想深入了解正則表達式的,可以點擊 這里

          首先看一個簡單的例子,如下使用“-”來分割字符串,

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


          看起來很簡單,只需要在找出分割復(fù)就行了,如你想使用“c”作為分割符,那輸出就是aa-bb-  -dd。另外再看一下,使用空格符(s)來分割字符串(Space鍵,tab鍵或者換行符),如下:

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

       

          在這里就有點不同的,在java里反斜線()有著特別的含義,為避免混淆或者出現(xiàn)異常, 應(yīng)該使用(),類似的,看一下使用“|”分割字符串,

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

       

      四、取子串

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

       

          在java7里,substring會創(chuàng)建一個字符串,如果是在java6,倡導(dǎo)使用如下方式:

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

       

          關(guān)于substring在java6和java7的區(qū)別,可以查閱相關(guān)文檔。

      五、如何將字符串轉(zhuǎn)換日期

      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

       

      六、String,StringBuilder,StringBuffer的區(qū)別

          String與StringBuilder的區(qū)別,String是創(chuàng)建之后不可以再修改,StringBuilder是可變的,創(chuàng)建之后可以修改。StringBuilder與StringBuffer的區(qū)別,StringBuffer是線程安全的,執(zhí)行速度相對StringBuffer會慢一點。

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

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

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

       

      八、讓字符串重復(fù)出現(xiàn)

          使用Apache Commons Lang的StringUtils,可以實現(xiàn)這一功能:

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

      其實現(xiàn)方式如下,注意,由于篇幅原因,并沒有考慮任何異常,詳細(xì)操作可以參考源碼:

       

      public String repeat(String str,int repeatTimes){
      		int inputLen = str.length();	//獲取字符串的長度
      		int outputLen = inputLen * repeatTimes;	//輸出字符串的長度
      		switch (inputLen) {
      		//當(dāng)長度只有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--){
      			//復(fù)制repeatTimes
      			buf[i] = ch;
      		}
      		
      		return buf.toString();
      	}



      九、如何計算指定字符在字符串里出現(xiàn)的次數(shù)

       

          同樣是使用Apache Commons Lang的StringUtils,如下:

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

       

          源碼研究不透,不太會其實現(xiàn)方式.如果你知道的,希望你可以分享一下,萬分感謝.

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

          當(dāng)String一旦創(chuàng)建,便不可再修改,直到gc將它回收.可gc的回收時間無法預(yù)測.即使一個對象不存在引用,也需要在未來的某個時間才會讓給出回收.所以String操作敏感信息,有滲漏的風(fēng)險.可char[]就不一樣了,我們可以通過程序直接控制其元素,一般敏感信息不再有用,直接將數(shù)組即可,因此更傾向使用char[]來保存密碼等敏感信息.

      国产一级婬片AAA毛,无码中文精品视视在线观看,欧美日韩a人成v在线动漫,五月丁香青草久久
      <code id="qf3hh"></code>
    • <menuitem id="qf3hh"></menuitem>
    • <strike id="qf3hh"><label id="qf3hh"></label></strike>