天天看點

字元串中的空格trim不起作用,一步debug教你直覺的看到why

前提知識

  • 字元串底層是char數組 1char=2Byte=16bit
  • 字元是根據不同類型的編碼映射的,類似于字典.Java預設Unicode編碼
  • 在Java中你寫’a’和(char)97 是一樣的,不懂看看編碼表

代碼+原理 講解

  1. 示例代碼
    // example
    	String a ="a";
        String b =" 半角空格(普通的) 半角空格但不換行"+(char)160;
        a.concat(b);
        // 注意 trim 是不能去除後面那個空格
        b.trim();
        // 轉為char數組 或者直接debug 均可看到 底層結構
        char[] chars = b.toCharArray();
        System.out.println(chars);
        System.out.println(a);
        System.out.println(b);
               

    debug截圖:

    分析:在trim之後我們發現 1 處已經沒有了,2 處仍舊存在,但是是我們手打的’ ‘,3 處是我們定義的(char)160,很明顯.我們trim的兩邊的空格左邊已經完成了,右邊失敗了.

    . . . . . 但是我們已經找到了這兩個空格是不同的. 他們分别是 (char)32 和(char)160;同時得出trim也是替換的(char)32.看源碼截圖:

    字元串中的空格trim不起作用,一步debug教你直覺的看到why
    注意:不要自作聰明 用replaceAll(’ ‘); 你這不是一樣的隻替換掉數組中的(char)32位置嗎?要使用replaceAll((char(160)+’’));這樣就行了
    字元串中的空格trim不起作用,一步debug教你直覺的看到why
  2. 額外的

    . . . . 你還可以看到漢字’半’他是一個char.但是UNICODE編碼.

  3. 附加常用特殊字元參考
/**普通的英文半角空格Unicode編碼*/
   private static final int SPACE_32 = 32;

   /**中文全角空格Unicode編碼(一個中文寬度)*/
   private static final int SPACE_12288 = 12288;

   /**普通的英文半角空格但不換行Unicode編碼(==   ==   == no-break space)*/
   private static final int SPACE_160 = 160;

   /**半個中文寬度(==   == en空格)*/
   private static final int SPACE_8194 = 8194;

   /**一個中文寬度(==   == em空格)*/
   private static final int SPACE_8195 = 8195;

   /**四分之一中文寬度(四分之一em空格)*/
   private static final int SPACE_8197 = 8197;
           

繼續閱讀