在Java中修剪字符串的正确方法

Posted

技术标签:

【中文标题】在Java中修剪字符串的正确方法【英文标题】:Correct way to trim a string in 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% 的差异,但前提是优化编译器出现问题。 【参考方案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 definition 或whitespace。

正如 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 leading 或just 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   

【讨论】:

以上是关于在Java中修剪字符串的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Java字符串修剪没有效果

java.sql.ResultSet 在增加列长度后返回修剪后的字符串

Java,如果 List 中修剪的 String 包含 String 则返回

C# 中从字符串中修剪换行符的最简单方法是啥?

java 修剪绑定字符串

如何修剪字符串的开头和结尾双引号?