Правильный способ обрезки строки в Java

в 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 ответов


Вы делаете все правильно. От документация:

строки являются постоянными, их значения не могут быть изменены после их создания. Буферы строк поддерживают изменяемые строки. Поскольку объекты String неизменяемы, их можно совместно использовать.

и с документация:

отделка

public String trim ()

возвращает копию строка, имеющая начальное и конечное пробелы опущено. Если этот объект String представляет пустую последовательность символов, или первый и последний символы последовательности символов, представленные этот строковый объект имеет коды больше, чем' \u0020 ' (пробел character), затем возвращается ссылка на этот строковый объект.

в противном случае, если нет символов с кодом больше чем '\u0020' в строке, затем новый объект String, представляющий пустой строка создается и возвращается.

в противном случае пусть K-индекс первого символа в строке чей код больше чем '\u0020', и пусть M-индекс последний символ в строке, код которой больше '\u0020'. Ля создается новый объект String, представляющий подстроку этого объекта строка, начинающаяся с символа в индексе k и заканчивающаяся символом символ при индексе m-то есть результат этого.подстрока (k, m+1).

этот метод может использоваться для обрезки пробелов (как определено выше) из начало и конец строки.

возвращает:

копия этой строки с начальным и конечным пробелом удалена или эта строка, если она не имеет ведущего или конечного белого пространство.


As строки в Java являются неизменными объектами, нет способа выполнить обрезку на месте. Единственное, что вы можете сделать, чтобы обрезать строку, это создать новую обрезанную версию вашей строки и вернуть ее (и это то, что trim() метод).


теоретически вы не присваиваете себе переменную. Возвращаемое значение метода trim () присваивается входу переменной.

на практике реализация метода trim () оптимизирована таким образом, что она создает (и возвращает) другую переменную только при необходимости. В других случаях (когда на самом деле нет необходимости обрезать) он возвращает ссылку на исходную строку (в этом случае вы фактически назначаете переменную себе).

посмотреть http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.trim%28%29

в любом случае trim() не изменяет исходную строку, поэтому это правильный способ ее использования.


традиционный подход заключается в использовании метода trim inline...например:

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

Если это строка, которая должна быть обрезана для всех видов использования, обрезайте ее спереди, как вы это сделали. Повторное использование того же места памяти, что и вы, - неплохая идея, если вы хотите сообщить о своем намерении другим разработчикам. При написании на Java управление памятью не является ключевой проблемой, так как" подарок " Java заключается в том, что вам не нужно управлять им.


да,но все равно будет два объекта, пока сборщик мусора не удалит исходное значение, на которое указывал вход. Строки в Java являются неизменными. Вот хорошее объяснение:неизменяемость строк в Java.


Если нам нужно обрезать строку без использования методов trim (), split () Java, то следующий исходный код может быть полезен.

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

метод Java string 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   

этот фрагмент кода я сделал давно, который принимает массив символов в качестве параметра и возвращает строку. Немного больше изменений, необходимых для знаков препинания, хотя со значениями ascii. Может быть, это поможет.

  public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }