聲明:原創作品,轉載時請注明文章來自SAP師太技術博客( 博/客/園www.cnblogs.com):m.survivalescaperooms.com/jiangzhengjun,并以超鏈接形式標明文章原始出處,否則將追究法律責任!原文鏈接:http://m.survivalescaperooms.com/jiangzhengjun/p/4257572.html 字符串19.char類型相加20.程序中的Unicode轉義字符///u0022是雙引號的Unicode編碼表示 System.out.println("a/u0022.length() + /u0022b".length());// 2 Unicode編碼表示的字符是在編譯期間就轉換成了普通字符,它與普通轉義字符(如:/")是不一樣的,它們是在程序被解析為各種符號之后才處理轉義字符序列。
21.注釋中的Unicode轉義字符如果程序中含有以下的注釋:// d:/a/b/util ,程序將不能編譯通過,原因是/u后面跟的不是四個十六進制數字,但編譯器在編譯時卻要把/u開頭的字符的字符看作是Unicode編碼表示的字符。 所以要注意:注釋中也是支持Unicode轉義字符的。 另外一個問題是不能在注釋行的中間含有 /u000A 表示換行的Unicode字符,因為這樣在編譯時讀到 /u000A 時,表示行結束,那么后面的字符就會當作程序代碼而不在是注釋了。
22.Windows與Linux上的行結束標示符String line = (String)System.getProperties().get("line.separator"); for(int i =0; i < line.length();i++){ System.out.println((int)line.charAt(i)); } 在Windows上運行結果: 13 10 在Linux上運行的結果: 10 在Windows平臺上,行分隔符是由回車(/r)和緊其后的換行(/n)組成,但在Unix平臺上通常使用單獨的換行(/n)表示。
23.輸出0-255之間的ISO8859-1符byte bts[] = new byte[256]; for (int i = 0; i < 256; i++) { bts[i] = (byte) i; } // String str = new String(bts,"ISO8859-1");//正確的做法 String str = new String(bts);//使用操作系統默認編碼方式編碼(XP GBK) for (int i = 0, n = str.length(); i < n; i++) { System.out.print((int) str.charAt(i) + " "); } 上面不會輸出0-255之間的數字串,正確的方式要使用new String(bts," ISO8859-1") 方式來解碼。 ISO8859-1是唯一能夠讓該程序按順序打印從0到255的整數的缺少字符集,這也是唯一在字符和字節之間一對一的映射字符集。 通過java獲取操作系統的默認編碼方式: System.getProperty("file.encoding");//jdk1.4或之前版本 java.nio.charset.Charset.defaultCharset();//jdk1.5或之后版本
24.String的replace()與replaceAll()System.out.println(".".replaceAll(".class", "http://$")); 上面程序將 . 替換成 /$,但運行時報異常,主要原replaceAll的第二參數有兩個字符(/ $)是特殊字符,具有特殊意思(/用來轉移 / 與 $,$后面接數字表示反向引用)。另外,replaceAll的第一參數是正則表達式,所以要注意特殊字符,正確的作法有以下三種: System.out.println(".class".replaceAll("http://.", "http://////$")); System.out.println(".class".replaceAll("http://Q.//E", "http://////$")); System.out.println(".class".replaceAll(Pattern.quote("."), Matcher.quoteReplacement("http://$"))); API對/、/Q與/E的解釋:/ 引用(轉義)下一個字符/Q引用所有字符,直到 /E /E結束從 /Q 開始的引用 JDK5.0新增了一些解決此問題的新方法: java.util.regex.Pattern.quote(String s):使用/Q與/E將參數引起來,這些被引用的字符串就是一般的字符,哪怕含有正則式特殊字符。 java.util.regex.Matcher.quoteReplacement(String s):將/與$轉換成能應用于replaceAll第二個參數的字符串,即可作為替換內容。 String的replace(char oldChar, char newChar)方法卻不使用正則式,但它們只支持字符,而不是字符串,使用起來受限制: System.out.println(".".replace('.','//'));//能將 . 替換成 / System.out.println(".".replace('.','$')); //能將 . 替換成 $
25.一段程序的三個BugRandom rnd = new Random(); StringBuffer Word = null; switch (rnd.nextInt(2)) { case 1: word = new StringBuffer('P'); case 2: word = new StringBuffer('G'); default: word = new StringBuffer('M'); } word.append('a'); word.append('i'); word.append('n'); System.out.println(word); 上面的程序目的是等概率的打印 Pain、Gain、Main 三個單詞,但多次運行程序卻發現永遠只會打印 ain,這是為什么? 第一個問題在于:rnd.nextInt(2)只會返回0、1 兩個數字,所以上面只會走case 1: 的分支語句,case 2: 按理是永遠不會走的。 第二個問題在于:如果case語句不以break結束時,則一直會往向運行,即直到執行到break的case語句止,所以上面的的語句每次都會執行default分支語句。 第三個問題在于:StringBuffer的構造函數有兩種可接受參數的,一個是StringBuffer(int capacity)、另一個是StringBuffer(String str),上面用的是StringBuffer(char)構造函數,實質上運行時將字符型轉換成了int型,這樣將字符當作StringBuffer的初始容量了,而不是字符本身。 以下是修改后的程序片段: Random rnd = new Random(); StringBuffer word = null; switch (rnd.nextInt(3)) { case 1: word = new StringBuffer("P"); break; case 2: word = new StringBuffer("G"); break; default: word = new StringBuffer("M"); break;// 可以不要 } word.append('a'); word.append('i'); word.append('n'); System.out.println(word);
新聞熱點
疑難解答