29

In Java, I am doing this to trim a string:

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

Output is:

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

Works. But I wonder if by assigning a variable to itself, I am doing the right thing. I don't want to waste resources by creating another variable and assigning the trimmed value to it. I would like to perform the trim in-place.

So am I doing this right?

Quest Monger
  • 8,252
  • 11
  • 37
  • 43
  • 5
    Worrying about the resources consumed by another variable is almost always micro-optimization anyway. It's the kind of thing that *might* make a 0.0001% difference in the program's resource usage, but only if there's something wrong with the optimizing compiler. – Michael Myers Nov 29 '13 at 18:50

8 Answers8

18

You are doing it right. From the documentation:

Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared.

Also from the documentation:

trim

public String trim()

Returns a copy of the string, with leading and trailing whitespace omitted. If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u0020' (the space character), then a reference to this String object is returned.

Otherwise, if there is no character with a code greater than '\u0020' in the string, then a new String object representing an empty string is created and returned.

Otherwise, let k be the index of the first character in the string whose code is greater than '\u0020', and let m be the index of the last character in the string whose code is greater than '\u0020'. A new String object is created, representing the substring of this string that begins with the character at index k and ends with the character at index m-that is, the result of this.substring(k, m+1).

This method may be used to trim whitespace (as defined above) from the beginning and end of a string.

Returns:

A copy of this string with leading and trailing white space removed, or this string if it has no leading or trailing white space.

gpojd
  • 22,558
  • 8
  • 42
  • 71
10

As strings in Java are immutable objects, there is no way to execute trimming in-place. The only thing you can do to trim the string is create new trimmed version of your string and return it (and this is what the trim() method does).

aga
  • 27,954
  • 13
  • 86
  • 121
2

In theory you are not assigning a variable to itself. You are assigning the returned value of method trim() to your variable input.

In practice trim() method implementation is optimized so that it is creating (and returning) another variable only when necessary. In other cases (when there is actually no need to trim) it is returning a reference to original string (in this case you are actually assigning a variable to itself).

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

Anyway trim() does not modify original string, so this is the right way to use it.

Dario
  • 548
  • 1
  • 7
  • 14
2

String::strip…

The old String::trim method has a strange definition of whitespace.

As discussed here, Java 11 adds new strip… methods to the String class. These use a more Unicode-savvy definition of whitespace. See the rules of this definition in the class JavaDoc for Character::isWhitespace.

Example code.

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

Or you can strip just the leading or just the trailing whitespace.

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
1

The traditional approach is to use the trim method inline...for example:

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

If it is a string that should be trimmed for all usages, trim it up front like you have done. Re-using the same memory location like you have done is not a bad idea, if you want to communicate your intent to other developers. When writing in Java, memory managment is not they key issue since the "gift" of Java is that you do not need to manage it.

Bruce Chidester
  • 621
  • 1
  • 5
  • 16
1

Yes, but there will still be two objects until the garbage collector removes the original value that input was pointing to. Strings in Java are immutable. Here is a good explanation: Immutability of Strings in Java.

Community
  • 1
  • 1
Isaac
  • 9,372
  • 4
  • 28
  • 31
0

If we have to trim a String without using trim(), split() methods of Java then following source code can be helpful.

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();
}
pnkjshrm30
  • 81
  • 1
  • 1
  • 3
0

The java string trim() method eliminates leading and trailing spaces

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

output

 hello string   javatpoint
hello stringjavatpoint