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.所有內(nèi)容相同的String指向同一個內(nèi)存塊。但String對象不能是通過new操作創(chuàng)建出來。主要原因是JVM對String做了優(yōu)化,String加載之后會持有一個常量池,
          只要在常量池中找到內(nèi)容相同的String就會把其引用返回。而new操作是直接在內(nèi)存中分配新空間。



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

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

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

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


          網(wǎng)站導(dǎo)航:
           

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

          Copyright © 遲來的兵

          主站蜘蛛池模板: 临夏县| 安阳市| 北京市| 安溪县| 阿荣旗| 余庆县| 东乌珠穆沁旗| 滦平县| 盘锦市| 郯城县| 浏阳市| 内黄县| 莱州市| 惠水县| 若尔盖县| 遵化市| 万全县| 轮台县| 安乡县| 丰城市| 绍兴市| 南宫市| 普格县| 临安市| 三门县| 喀什市| 枣阳市| 邯郸县| 奉新县| 昭通市| 龙游县| 团风县| 甘肃省| 昌江| 安溪县| 米易县| 嵩明县| 河津市| 红桥区| 南和县| 余姚市|