龙哥网

龙哥网

5分钟快速了解String.trim()到底做了什么事_java
2022-03-01

目录
  • 前言
  • 说我们认知的trim()
  • 复习一个小概念
  • 养成一个好习惯
  • 动起来,不瞎掰
    • 示例1
    • 示例2
    • 示例3
    • 示例4
    • 示例5
    • 示例6
  • 5分钟直接看这里
    • 总结

      前言

      项目中遇到用String.trim()的地方,点进去看了trim()源码,以前一直以为trim()的作用只是去除字符串中的首尾的“空格”符,但是源码看下来,好像这个说法不太准确呢。

      搞技术嘛,严谨一些,在这记录一下,大佬们也瞅瞅哈~

      说我们认知的trim()

      说到String.trim() 函数 ,就像前言说的一样,我的认知它就是搞首尾空格用的,虽然这个说法也没错哈。

      那这都说到这了,不试试看说不过去对吧:

      String str = " Hello World ";
      System.out.println(str.length());
      System.out.println(str.trim().length());
      

      小字都是旁白:“搞掉了吗?看样子是搞掉了。” 所以说它去除首尾空格没毛病哈。

      复习一个小概念

      Java 语言规范规定,Java 的 char 类型是 UTF-16 的 code unit,也就是一定是16位(2字节)。

      char(字符)的范围是:0-65535 or(\u0000~\uFFFF)

      看图看图!

      知乎一个大佬答主的回答:Java 语言中一个字符占几个字节?

      我怎么会让各位大佬去看别的链接呢,当然,如果有时间的话,我会单独整理一篇奉上。

      养成一个好习惯

      养成一个好习惯,多看看源码,其实很多时候,源码里的注释或者源码流程中就已经很好的解释了。

      而我们往往很多时候都不愿意去看源码。

      小字都是旁白:“源码都是英文,看着都头疼。坚持看完,可解偏头疼哟~”

      当然,即使大佬你真的不愿意去看源码。大佬您这都赏脸点进来了,自然由我来说给您听。

      在 JDK 1.8 中trim()的源码注释里其实已经解释的很清楚了:

      1. 删除任何前置和后置空格;

      2. 如果String对象表示一个空字符,则返回对这个String对象的引用;

      总结:【trim()大佬说了:你这有一个二五崽(空格),我换一个新崽给你】

      3. 如果String对象表示的字符的首和尾字符的编码都大于'\u0020'(空格字符),则返回对这个String对象的引用;

      总结:【trim()大佬说了:空格前后有兄弟,我不搞你】

      4. 如果String字符串中没有编码大于'\u0020'的字符,则返回一个表示空字符串的string对象;

      总结:【trim()大佬说了:看你可怜,给你送你一个新崽(新String对象,空的,长度为0的)】

      5. 假设 k 是代码大于'\u0020'的字符串中第一个字符的索引,假设 m 是代码大于''\u0020'的字符串中最后一个字符的索引。返回一个表示该字符串的子字符串,该子字符串以下标 k 处的字符开始,以下标 m 处的字符结束。即 substring(k, m + 1)。
      总结:【trim()大佬说了:前后的二五崽(小于'\u0020')我都带走,老实崽和有兄弟的二五仔都给你留下了】
      6. 如果使用trim()后的字符串长度不等于使用前的长度,就返回一个新崽(新String对象)给你;如果等于,就还给你以前的崽(原String对象)。
      总结:【trim()大佬说了:不等于 -> 你这个崽有猫腻(长度变了),给你换一个新崽;等于 -> 你这个崽没得问题,带回去好好养起】

      动起来,不瞎掰

      示例 1-6 对应了上面6条 trim() 源码说明。实践是实现真理的唯一标准实践是实现,大佬们,我直接开整了哈。

      示例1

         /**
      	* 1.删除任何前置和后置空格;
      	*/
      	@Test
      	public void str1(){
      	   String str = " Hello World ";
      	   System.out.println(str.length());
      	   System.out.println("trim():" + str.trim().length());
      	}
      

      示例2

         /**
           * 你这有一个二五崽(空格),我换一个新崽给你
           */
          @Test
          public void str2(){
              // 如果String对象表示一个空字符,则返回对这个String对象的引用;
              String str1 = " ";
              System.out.println(str1.length());
              String str2 = str1.trim();
              System.out.println("trim()->" + str2.length());
              System.out.println(str1 == str2);
          }
      

      示例3

          /**
           * 空格前后有兄弟,我不搞你
           */
          @Test
          public void str3(){
              String str1 = "aaa bbb ccc";
              System.out.println(str1.length());
              String str2 = str1.trim();
              System.out.println(str2.length());
          }
      

      示例4

        /**
          * 看你可怜,给你送你一个新崽(新String对象,空的,长度为0的)
          */
          @Test
          public void str4(){
              // 你有32个崽;
              char[] chars = new char[32];
              for (int i = 0; i < 32; i++) {
                  chars[i] = (char) i;
              }
              String oldStr = new String(chars);
              System.out.println(oldStr.length());
              // 可惜是32个二五崽
              String newStr = oldStr.trim();
              System.out.println(newStr.trim().length());
              System.out.println(oldStr == newStr);
          }
      

      示例5

         /**
           * 假设 k 是代码大于'\u0020'的字符串中第一个字符的索引,
           * 假设 m 是代码大于''\u0020'的字符串中最后一个字符的索引。
           * 返回一个表示该字符串的子字符串,该子字符串以下标 k 处的
           * 字符开始,以下标m处的字符结束。即substring(k, m + 1)。
           */
          @Test
          public void str5(){
              // 先准备8个崽
              char[] chars = new char[8];
              // 3个二五崽
              for (int i = 0; i < 3; i++) {
                  chars[i] = (char) i;
              }
              chars[3] = 65;
              chars[4] = 66;
              // 二五崽(小于空格符,空格符是32)
              chars[5] = 31;
              chars[6] = 68;
              // 二五崽(小于空格符,空格符是32)
              chars[7] = 21;
              String oldStr = new String(chars);
              System.out.println("oldStr.length():" + oldStr.length());
              System.out.println("oldStr:" + oldStr);
              String newStr = oldStr.trim();
              System.out.println("newStr.length():" + newStr.length());
              System.out.println("newStr:" + newStr);
          }
      

      示例6

      /**
           * 不等于 -> 你这个崽有猫腻(长度变了),给你换一个新崽;等于 -> 你这个崽没得问题,带回去好好养起
           */
          @Test
          public void str6(){
              // 准备5个崽
              char[] chars = new char[5];
              // 3个二五崽
              for (int i = 0; i < 3; i++) {
                  chars[i] = (char) i;
              }
              chars[3] = 65;
              chars[4] = 66;
              String str1 = new String(chars);
              String str2 = "ABCDE";
      
              String newStr1 = str1.trim();
              String newStr2 = str2.trim();
      
      
              System.out.println("str1.length():" + str1.length());
              System.out.println("newStr1.length():" + newStr1.length());
              System.out.println(str1 == newStr1);
              System.out.println("=========================\n");
      
              System.out.println("str2.length():" + str2.length());
              System.out.println("newStr2.length():" + newStr2.length());
              System.out.println(str2 == newStr2);
          }
      

      5分钟直接看这里

      trim()到底做了什么事

      1. 去除 String 中的首尾空格;
      2. 无法去除字符串中间含有空格的;
      3. 准确说实际去除的是小于十进制32(32就是空格,可以去看Ascii表)的所有字符。
      4. 当 String 中全是小于32的字符时,返回一个新的字符给你。
      5. String.trim() 长度变化就是新对象,无变化就还是自己。

      trim()方法可以去除的字符明细可以通过以下函数进行输出:

      public class StringTest {
      
      public static void main(String[] args) {
      
      char[] chars = new char[20];
      
      chars[0] = ‘\u0000';
      
      chars[1] = ‘\u0001';
      
      chars[2] = ‘\u0002';
      
      chars[3] = ‘\u0003';
      
      chars[4] = ‘\u0004';
      
      chars[5] = ‘\u0005';
      
      chars[6] = ‘\u0006';
      
      chars[7] = ‘\u0007';
      
      chars[8] = ‘\u0008';
      
      chars[9] = ‘\u0009';
      
      chars[10] = ‘\u0010';
      
      chars[11] = ‘\u0012';
      
      chars[12] = ‘\u0013';
      
      chars[13] = ‘\u0014';
      
      chars[14] = ‘\u0015';
      
      chars[15] = ‘\u0016';
      
      chars[16] = ‘\u0017';
      
      chars[17] = ‘\u0018';
      
      chars[18] = ‘\u0019';
      
      chars[19] = ‘\u0020';
      
      
      
      for (int i = 0; i < chars.length; i++) { System.out.print("(" + i + ")" + chars[i] + " "); if (i != 0 && i % 5 == 0) { System.out.println(); } } } }

      输出如下:

      总结

      免责声明
      本站部分资源来源于互联网 如有侵权 请联系站长删除
      龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。