String要點

          Posted on 2008-12-06 19:39 遲來的兵 閱讀(239) 評論(0)  編輯  收藏 所屬分類: Java
          一.String對象的比較,+操作和intern方法
          這里從一個問題入手來看看。

          package testPackage;
             public class Test {
                  
          public static void main(String[] args) {
                      String hello 
          = "Hello", lo = "lo";
                      System.out.print((hello 
          == "Hello"+ " ");
                      System.out.print((Other.hello 
          == hello) + " ");
                      System.out.print((other.Other.hello 
          == hello) + " ");
                      System.out.print((hello 
          == ("Hel" + "lo")) + " ");
                      System.out.print((hello 
          == ("Hel" + lo)) + " ");
                      System.out.println(hello 
          == ("Hel" + lo).intern());
                  }

              }
              class Other {
                  
          static String hello = "Hello";
              }


          package other;
              public class Other {
                  
          static String hello = "Hello";
              }

          正確答案:true true true true false true
          主要要點有:
          1.所有內容相同的String指向同一個內存塊。但String對象不能是通過new操作創建出來。主要原因是JVM對String做了優化,String加載之后會持有一個常量池,
          只要在常量池中找到內容相同的String就會把其引用返回。而new操作是直接在內存中分配新空間。



          2.Java中有兩種綁定,靜態和動態。如果+操作的兩邊是常量表達式那么會在采用靜態綁定,也就是說編譯之后值已經定下來了。而如果有一邊是通過new操作創建出
          來的那么會采用動態綁定,只有在運行的時候才知道其具體的值。
          3.String的intern方法會到常量池里面找是否有相同內容的String,如果有則返回其引用。如果沒有則把這個String對象添加到常量池之中并放回其引用。額外說
          下,intern在英文中有保留區的意思,這樣好理解其作用。intern方法還是native的。
          二.String中的正則表達式使用

          String中有些方法是需要正則表達式作為參數的。這個時候就要主要不要傳錯參數。最典型的例子就是replaceAll(String regex, String replacement)。第一個
          參數是需要正則表達式的,而第二參數是普通的字符串。
                  String ss = "???";
                  ss 
          = ss.replaceAll("?""=");//運行到這里會拋出PatternSyntaxException,因為“?”在正則表達式里面是特殊符號,需要轉義。
                  ss = ss.replaceAll("[?]""=");//正確,我個人比較傾向于這種寫法。
                  ss = ss.replaceAll("\\?""=");//正確,對“?”做轉義。

          因此在使用split,replaceAll,replaceFirst等方法時要特別注意是不是需要轉義.

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          posts - 6, comments - 8, trackbacks - 0, articles - 1

          Copyright © 遲來的兵

          主站蜘蛛池模板: 花莲县| 大田县| 旬邑县| 婺源县| 永定县| 泰顺县| 宜宾市| 峡江县| 德保县| 崇礼县| 永定县| 监利县| 耒阳市| 炉霍县| 清苑县| 贵港市| 边坝县| 共和县| 香港| 岱山县| 金华市| 鸡泽县| 枣强县| 平利县| 化州市| 海安县| 山东| 贵港市| 含山县| 武山县| 贡觉县| 呼玛县| 山阳县| 高邮市| 务川| 长宁区| 西平县| 攀枝花市| 长岛县| 吴忠市| 乐亭县|