国内精品久久久久久久星辰影视-亚洲天堂久久精品成人-亚洲国产成人综合青青-91精品啪在线看国产网站-日韩一区二区在线观看

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

    java String常見(jiàn)十大問(wèn)題

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

    Technorati 標記: ,

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

        對String來(lái)說(shuō),”==“是用來(lái)判斷兩個(gè)字符串(對象)的地址是否相同,即判斷是否是同一個(gè)字符串的應用。”equals()“則是判斷兩個(gè)字符串(對象)的值是否相等,如果相等則返回true。一般情況下,都是使用”equals()“來(lái)判斷兩個(gè)字符串的值是否相等,只有當你需要判斷兩個(gè)字符串是否是同一個(gè)對象時(shí),才使用”==“。

    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內存管理分配的,可以點(diǎn)擊 這里。

    二、如何實(shí)現String與基本數據類(lèi)型的裝換

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

    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

     

        也許會(huì )見(jiàn)過(guò)使用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

     

        這種形式也行,只不過(guò)沒(méi)有直接使用parseXxx()好,因為Integer.valueOf()返回的是Integer類(lèi)型,再通過(guò)自動(dòng)集裝箱轉換為基本數據類(lèi)型,其方法原型如下:

    public static Integer valueOf(String s)

     

        注意的是,方法Boolean.parseBoolean(String str),只有在str為字符串“true”時(shí)(忽略大小寫(xiě)),才會(huì )返回true。換句話(huà)說(shuō)就是其他字符串都是返回false。Boolean.parseBoolean(“yes”)將返回false。接著(zhù)下來(lái)看一下如何將基本數據類(lèi)型轉換為String,可以使用String.valueOf()方法進(jì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í)還有著(zhù)更為簡(jiǎn)單快捷的方式,直接在基本數據類(lèi)型之后添加“ ”,如下;

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


        最后談一下wrapper class的轉換,同樣可以將基本數據類(lèi)型轉換為String,如下:

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

        事實(shí)上,String.valueOf()方法也是調用了各種wrapper  class的toString()方法,如下。只不過(guò)String.valueOf()用起來(lái)會(huì )方便一點(diǎn),因為不需要去判斷數據屬于哪一種類(lèi)型。

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

     

    三、如何分割字符串

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

        首先看一個(gè)簡(jiǎn)單的例子,如下使用“-”來(lái)分割字符串,

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


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

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

     

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

    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會(huì )創(chuàng )建一個(gè)字符串,如果是在java6,倡導使用如下方式:

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

     

        關(guān)于substring在java6和java7的區別,可以查閱相關(guā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的區別

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

    七、在switch語(yǔ)句中使用字符串

        從java7開(kāi)始,可以在switch語(yǔ)句中使用字符串,如下:

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

     

    八、讓字符串重復出現

        使用Apache Commons Lang的StringUtils,可以實(shí)現這一功能:

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

    其實(shí)現方式如下,注意,由于篇幅原因,并沒(méi)有考慮任何異常,詳細操作可以參考源碼:

     

    public String repeat(String str,int repeatTimes){
    		int inputLen = str.length();	//獲取字符串的長(cháng)度
    		int outputLen = inputLen * repeatTimes;	//輸出字符串的長(cháng)度
    		switch (inputLen) {
    		//當長(cháng)度只有1或2時(shí),選擇直接使用字符操作,增加效率
    		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();
    	}



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

     

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

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

     

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

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

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