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

时间:2013-11-29 18:04:49

标签: java string variable-assignment trim

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

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

输出是:

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

作品。但我想知道如果通过为自己分配一个变量,我做的是正确的。我不想通过创建另一个变量并为其分配修剪值来浪费资源。我想在原地进行修剪。

我这样做是对的吗?

8 个答案:

答案 0 :(得分:18)

你做得对。来自the documentation

  

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

同样来自documentation

  

<强>修剪

     

public String trim()

     
    

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

         

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

         

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

         

此方法可用于从中修剪空白(如上所述)     字符串的开头和结尾。

         

<强>返回

         
      

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

    
  

答案 1 :(得分:10)

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

答案 2 :(得分:2)

理论上,您不是为自己分配变量。您将方法trim()的返回值赋给变量输入。

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

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

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

答案 3 :(得分:1)

传统方法是使用内联修剪方法...例如:

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

如果它是一个应该为所有用法进行修剪的字符串,请像完成前一样修剪它。如果您想将您的意图传达给其他开发人员,重新使用与您相同的内存位置并不是一个坏主意。在用Java编写时,内存管理不是关键问题,因为Java的“礼物”是你不需要管理它。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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空格。

答案 6 :(得分:0)

如果我们必须修剪String而不使用trim(),Java的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();
}

答案 7 :(得分:0)

java string trim()方法消除了前导和尾随空格

let parameters = ["details": [
            "fullName": "manish",
            "password": "123456",
            "email": "manish@gmail.com",
            "mobile": "",
            "dob": "",
            "profilePic": ""
            ]] as [String : Any]

输出

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()  
}}