国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java高質(zhì)量代碼之 — 字符串

前言:由于上一個星期工作繁忙,利用上下班和晚上睡前空余的時間拜讀了秦小波老師的《改善Java程序的151建議》,感覺廓然開朗,注意到了很多平時在編寫代碼中并不會注意的問題,甚至感覺自己對Java只是略懂皮毛,不足以登大雅之堂,特此與讀者分享讀書筆記,以下內(nèi)容摘自《改善Java程序的151建議》一書和筆者的理解


Java高質(zhì)量代碼系列文章
      面向?qū)ο笃?http://ray-yui.iteye.com/blog/1926984
      數(shù)據(jù)類型篇:http://ray-yui.iteye.com/blog/1927251
          字符串篇:http://ray-yui.iteye.com/blog/1927647
      數(shù)組與集合(1):http://ray-yui.iteye.com/blog/1928170
      數(shù)組與集合(2):http://ray-yui.iteye.com/blog/1930155


繼上一章講了數(shù)據(jù)類型,但在Java當(dāng)中,什么數(shù)據(jù)類型使用頻率最高,最受大家喜愛?那就是我們無限兼容的String類型,擁有諸多方法的String類型,近乎萬能的String類型,而在使用String類型當(dāng)中我們要注意什么?


1.推薦使用String直接賦值
    首先我們來看一道經(jīng)典的題目

Java代碼  
  1. public static void main(String[] args) {  
  2.         String str1 = "Hello";  
  3.         String str2 = "Hello";  
  4.         String str3 = new String("Hello");  
  5.         System.out.println(str1 == str2);  
  6.         // 輸出結(jié)果為true  
  7.         System.out.println(str1 == str3);  
  8.         // 輸出結(jié)果為false  
  9.     }  


      以上代碼,相信老鳥并不陌生,或者在學(xué)習(xí)過程中接觸,或者在面試題上坑過,原因是Java當(dāng)中為了避免系統(tǒng)大量的產(chǎn)生String對象,于是就設(shè)計(jì)出一個字符串常量池,當(dāng)創(chuàng)建一個String時,會首先在常量池當(dāng)中檢查是否存在這個Hello這個常量,若然不存在,創(chuàng)建,若然存在,將內(nèi)存地址指向此常量地址,str1賦值時,首先在常量池中創(chuàng)建了Hello,而str2再賦值時,Java檢查到常量池中有Hello,直接將Hello的地址賦予了str2,造成str1==str2的情況,而new String的情況下,Java不會去常量池尋找,而是直接在堆中建立對象,所以使用str1==str3自然不成立,通過上面的介紹,由于常量池是由JVM本身進(jìn)行維護(hù)的,所以JVM本身已對常量池進(jìn)行了大量優(yōu)化,所以使用直接賦值的方式會比使用new String的方式效率更高,更節(jié)省內(nèi)存空間.


2.注意正則表達(dá)式引發(fā)的問題
      請觀察以下一段代碼

Java代碼  
  1. public static void main(String[] args) {  
  2.         // 1  
  3.         String str1 = "AHelloA";  
  4.         str1 = str1.replaceAll("A", "");  
  5.         System.out.println(str1.equals("Hello"));  
  6.         // 輸出為true  
  7.   
  8.         // 2  
  9.         String str2 = "$Hello$";  
  10.         str2 = str2.replaceAll("$", "");  
  11.         System.out.println(str2.equals("Hello"));  
  12.         // 輸出為false  
  13.   
  14.         // 3  
  15.         String str3 = "$Hello$";  
  16.         str3 = str3.replaceAll("\\$", "");  
  17.         System.out.println(str3.equals("Hello"));  
  18.         // 輸出為true  
  19.   
  20.         // 4  
  21.         String str4 = "$Hello$";  
  22.         // 更改了replace方法  
  23.         str4 = str4.replace("$", "");  
  24.         System.out.println(str4.equals("Hello"));  
  25.         // 輸出true  
  26.     }  


      注意觀察//2 ,大家還記得正則表達(dá)式嗎?這是因?yàn)閞eplaceAll的方法其實(shí)是接受一個正則表達(dá)式,而$符號剛好是正則表達(dá)式的結(jié)束符號,所以出現(xiàn)了//2的情況,以后使用replaceAll時需要注意


3.注意String的不變性
      請觀察以下代碼

Java代碼  
  1. public static void main(String[] args) {  
  2.         // 1  
  3.         String str1 = "Hello";  
  4.         str1 += " World";  
  5.         System.out.println(str1);  
  6.         // 輸出Hello World  
  7.   
  8.         // 2  
  9.         str1.replace("World", "");  
  10.         System.out.println(str1);  
  11.         // 輸出Hello World  
  12.   
  13.         // 3  
  14.         str1.substring(3);  
  15.         System.out.println(str1);  
  16.         // 輸出Hello World  
  17.     }  


      在上面的代碼當(dāng)中,//1中,究竟創(chuàng)建了多少個String?一共是創(chuàng)建了3個,第一為Hello,第二為World,第三為Hello World,因?yàn)橹苯淤x值的方式是在字符串常量池中生成的常量,什么是常量?不可變就為常量,因?yàn)椴豢勺?所以//1中產(chǎn)生的了3個String,而//2中為什么我替換了還是等于Hello World呢?這也是因?yàn)椴蛔冃?仔細(xì)的你會發(fā)現(xiàn),String類中提供的修改字符串的方法,包括substring,replace,concat等都是返回一個新的字符串,這是因?yàn)樽址牟蛔冃栽斐傻?所以在調(diào)用這些方法時需要用另一個或本調(diào)用的string去進(jìn)行接收,//3同理


4.注意字符串的位置
      請觀察以下代碼

Java代碼  
  1. public static void main(String[] args) {  
  2.         String str1 = 1 + 2 + "Hello";  
  3.         System.out.println(str1);  
  4.         // 輸出3Hello  
  5.   
  6.         String str2 = "Hello" + 1 + 2;  
  7.         System.out.println(str2);  
  8.         // 輸出Hello12  
  9.     }  


      筆者認(rèn)為String是一個霸道的類型,而且霸道得我很歡喜,因?yàn)槿魏闻cString類型進(jìn)行+號操作的其他類型,都會自動升格為String類型,而上例中是因?yàn)槭紫葓?zhí)行1+2的操作,再偶遇到String的Hello,再進(jìn)行了自動升格,而第二個例子中,在還沒進(jìn)行整形的加法運(yùn)算時,就首先偶遇到了String,已經(jīng)自動提升為String,所以就等于Hello1+2的操作,自然等于Hello12


5.正確使用String,StringBuffer,StringBuilder
      在上文當(dāng)中,曾經(jīng)提到過String的不變性,在String原因下,就產(chǎn)生出了StringBuffer和StringBuilder,后2者為可變的字符串,亦可以稱為緩沖字符串,主要原理其實(shí)很簡單,就是緩沖字符串中的字符串形式是char數(shù)組,以下來分析StringBuffer和String的幾點(diǎn)不同
      1.在頻繁的字符串運(yùn)算,例如拼接,刪除,增加,替換,解釋XML,進(jìn)行SQL拼接
        的時候,請優(yōu)先考慮使用StringBuffer

      2.在性能考慮方面,由于StringBuffer帶有緩沖區(qū),而且最終使用toString()
        方法轉(zhuǎn)換成1個字符串,我們試想,StringBuffer無論里面的信息是多么的
        復(fù)雜,但最終是生成了1個字符串對象,效率會比用+號拼接不停生成字符串
        的效率要高

      3.想使用更多功能時,例如字符串翻轉(zhuǎn)reverse,字符串插入insert,這些都是
        String所不提供的,而StringBuffer卻支持,所以想增加某些功能時,使用
        StringBuffer

      4.StringBuffer和StringBuilder區(qū)別?很簡單,StringBuffer是線程安全的,
        在多線程的環(huán)境底下應(yīng)該使用StringBuffer,而StringBuilder線程是不
        安全的,由于現(xiàn)在流行的SSH框架,而struts2中Action是線程安全的,所以
        請大膽的使用StringBuilder


6.推薦在復(fù)雜字符串操作中使用正則表達(dá)式
      正則表達(dá)式是筆者非常喜愛的東西,對字符串的操作而言,簡直是萬能,但卻不容易一眼看穿究竟正則想表達(dá)些什么,因?yàn)楫吘故且苑杹肀磉_(dá),在String中很多操方法都支持正則表達(dá)式,例如replace,split,substring等等,都知道正則表達(dá)式的參數(shù),所以在操作復(fù)雜的字符串例如郵箱驗(yàn)證時,請務(wù)必使用正則表達(dá)式


7.使用字符串解決編碼問題
      相信各位接觸過Web開發(fā)經(jīng)驗(yàn)的開發(fā)人員都肯定接觸過亂碼問題,有時是從Web接受時遇到的,有時是從數(shù)據(jù)庫中讀取到亂碼,而亂碼的元兇就在于我們的IDE,使用javac進(jìn)行編譯時,JDK默認(rèn)生成的編碼是UTF-8的UNICODE編碼,但在IDE開發(fā)進(jìn)行編譯時,若沒有指定的話就會使用機(jī)器默認(rèn)的語言,例如Window就會使用GBK等,而怎么樣解決這個問題呢?除了在框架配置中解決,還可以在String當(dāng)中使用代碼來解決亂碼,請看以下例子

Java代碼  
  1. public static void main(String[] args) throws UnsupportedEncodingException {  
  2.         String str1 = "你好";  
  3.   
  4.         // 第一種方法,此種方法需要知道來源字符串的編碼  
  5.         byte[] byte1 = str1.getBytes("GBK");  
  6.         String str2 = new String(byte1);  
  7.   
  8.         // 第二種方法,此種方法需要知道轉(zhuǎn)變?yōu)槭裁锤袷降淖址?推薦使用  
  9.         String str3 = new String(str1.getBytes(), "UTF-8");  
  10.     }  


8.對字符串排序持寬容心態(tài)
      例如創(chuàng)建了一個字符串?dāng)?shù)組,使用Arrays.sort()進(jìn)行自然排序,注意是自然排序,就會出現(xiàn)排序混亂的情況,為什么呢?因?yàn)槲覀僇ava對字符串排序時是根據(jù)了UNICODE編碼來進(jìn)行排序,是UNICODE編碼對漢字的順序并不是連貫連續(xù)的,所以若然要對字符串進(jìn)行精確排序,可以選擇使用pingyin4j轉(zhuǎn)換成拼音后再首字母排序


總結(jié):
      筆者在本文章中只從《改善Java程序的151建議》中提取部分進(jìn)行歸納性敘述,推薦各位讀者購買這本書,該書不僅從事例中學(xué)習(xí),而且涉及到原理,底層的實(shí)現(xiàn),不僅告訴你應(yīng)該怎么做,還告訴你為什么要這樣做.  
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
零基礎(chǔ)入門學(xué)習(xí)java第六節(jié):Java字符串
String詳解, String和CharSequence區(qū)別, StringBuilder和StringBuffer的區(qū)別 (String系列之1)
JAVA學(xué)習(xí)筆記之String類型和字符串常量區(qū)
Java字符串的10大熱點(diǎn)問題盤點(diǎn) – 碼農(nóng)網(wǎng)
Java筆試題分類總結(jié)
Java 字符串拼接效率分析及最佳實(shí)踐
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服