【问题标题】:Correct way to trim a string in Java在Java中修剪字符串的正确方法
【发布时间】:2013-12-15 23:27:54
【问题描述】:

在 Java 中,我这样做是为了修剪字符串:

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.trim();
System.out.println("after->>"+input+"<<-");

输出是:

before->> some Thing <<-
after->>some Thing<<-

有效。但我想知道是否通过为自己分配一个变量,我做对了。我不想通过创建另一个变量并将修剪后的值分配给它来浪费资源。我想就地进行修剪。

那么我这样做对吗?

【问题讨论】:

  • 担心另一个变量消耗的资源几乎总是微优化。这种情况可能对程序的资源使用造成 0.0001% 的差异,但前提是优化编译器出现问题。

标签: java string variable-assignment trim


【解决方案1】:

你做得对。来自the documentation

字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为 String 对象是不可变的,所以它们可以被共享。

同样来自documentation

修剪

公共字符串修剪()

返回字符串的副本,带有前导和尾随空格 省略。如果此 String 对象表示一个空字符序列, 或表示的字符序列的第一个和最后一个字符 此 String 对象的代码都大于 '\u0020'(空格 字符),则返回对该 String 对象的引用。

否则,如果没有代码大于'\u0020'的字符 在字符串中,然后是一个表示空字符串的新 String 对象 被创建并返回。

否则,设 k 为字符串中第一个字符的索引 其代码大于 '\u0020',设 m 为 字符串中代码大于 '\u0020' 的最后一个字符。一种 创建了新的 String 对象,表示 this 的子字符串 以索引 k 处的字符开始并以 索引 m 处的字符——即 this.substring(k, m+1) 的结果。

此方法可用于从 字符串的开头和结尾。

返回

删除前导和尾随空格的此字符串的副本,或者如果该字符串没有前导或尾随空格,则为该字符串 空间。

【讨论】:

    【解决方案2】:

    作为strings in Java are immutable objects,无法就地执行修剪。修剪字符串的唯一方法是创建字符串的新修剪版本并将其返回(这就是 trim() 方法所做的)。

    【讨论】:

      【解决方案3】:

      理论上,您并没有将变量分配给自身。您正在将 trim() 方法的返回值分配给变量输入。

      实际上,trim() 方法的实现已经过优化,因此它仅在必要时创建(并返回)另一个变量。在其他情况下(实际上不需要修剪),它会返回对原始字符串的引用(在这种情况下,您实际上是在为自己分配一个变量)。

      http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.trim%28%29

      反正 trim() 不会修改原始字符串,所以这是正确的使用方法。

      【讨论】:

        【解决方案4】:

        String::strip…

        旧的String::trim 方法有一个strange definitionwhitespace

        正如 here 所讨论的,Java 11 向 String 类添加了新的 strip… 方法。这些使用了更加通晓 Unicode 的空白定义。请参阅 Character::isWhitespace 的 JavaDoc 类中此定义的规则。

        示例代码。

        String input = " some Thing ";
        System.out.println("before->>"+input+"<<-");
        input = input.strip();
        System.out.println("after->>"+input+"<<-");
        

        或者您可以去除just the leadingjust the trailing 空格。

        【讨论】:

          【解决方案5】:

          传统的做法是使用内联的trim方法...例如:

          String input = " some Thing ";
          System.out.println("before->>"+input+"<<-");
          System.out.println("after->>"+input.trim()+"<<-");
          

          如果它是一个应该为所有用途修剪的字符串,请像之前一样修剪它。如果您想将您的意图传达给其他开发人员,那么像您一样重用相同的内存位置并不是一个坏主意。用 Java 编写时,内存管理不是关键问题,因为 Java 的“天赋”是您不需要管理它。

          【讨论】:

            【解决方案6】:

            是的,但是在垃圾收集器删除输入指向的原始值之前,仍然会有两个对象。 Java 中的字符串是不可变的。这是一个很好的解释:Immutability of Strings in Java

            【讨论】:

              【解决方案7】:

              如果我们必须在不使用 Java 的 trim()、split() 方法的情况下修剪字符串,那么以下源代码可能会有所帮助。

              static String allTrim(String str)
              {
                  int j = 0;
                  int count = 0;  // Number of extra spaces
                  int lspaces = 0;// Number of left spaces
                  char ch[] = str.toCharArray();
                  int len = str.length();
                  StringBuffer bchar = new StringBuffer();
                  if(ch[0] == ' ')
                  {
                      while(ch[j] == ' ')
                      {
                          lspaces++;
                          j++;
                      }   
                  }   
                  for(int i = lspaces; i < len; i++)
                  {   
                      if(ch[i] != ' ')
                      {
                          if(count > 1 || count == 1)     
                          {
                              bchar.append(' ');
                              count = 0;
                          }
                          bchar.append(ch[i]);
                      }
                      else if(ch[i] == ' ')
                      {
                          count++;    
                      }
                  }
                  return bchar.toString();
              }
              

              【讨论】:

                【解决方案8】:

                java 字符串 trim() 方法消除前导和尾随空格

                public class StringTrimExample{  
                public static void main(String args[]){  
                String s1="  hello string   ";  
                System.out.println(s1+"javatpoint");//without trim()  
                System.out.println(s1.trim()+"javatpoint");//with trim()  
                }}  
                

                输出

                 hello string   javatpoint
                hello stringjavatpoint   
                

                【讨论】:

                  猜你喜欢
                  • 2010-11-29
                  • 1970-01-01
                  • 2020-01-25
                  • 2016-08-22
                  • 2011-01-06
                  • 1970-01-01
                  • 2011-05-18
                  • 2013-09-24
                  • 2019-08-19
                  相关资源
                  最近更新 更多