Подтвердить что ты не робот

Правильный способ обрезать строку в 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<<-

Работает. Но я задаюсь вопросом, правильно ли присваивая себе переменную, я поступаю правильно. Я не хочу тратить ресурсы, создавая другую переменную и присваивая ей обрезанное значение. Я хотел бы выполнить обрезку на месте.

Так я делаю это правильно?

4b9b3361

Ответ 1

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

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

Также из документации:

подрезать

public String trim()

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

     

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

     

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

     

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

     

Возвращает

     
  

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

  

Ответ 2

Поскольку строки в Java являются неизменяемыми объектами, невозможно выполнить обрезку на месте. Единственное, что вы можете сделать, чтобы обрезать строку, - это создать новую обрезанную версию вашей строки и вернуть ее (и это делает метод 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

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

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

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

Ответ 5

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

Ответ 6

Если нам нужно обрезать String без использования методов 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();
}

Ответ 7

Этот фрагмент кода, который я сделал давно, принимает массив символов в качестве параметра и возвращает строку. Мало больше изменений требуется для пунктуации, хотя с значениями 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);
  }

Ответ 8

Метод 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   

Ответ 9

String::strip…

Старый метод String::trim имеет странное определение пробела.

Как обсуждалось здесь, Java 11 добавляет новые методы strip… в класс String. Они используют более удобное для Unicode определение пробелов. См. Правила этого определения в классе JavaDoc для Character::isWhitespace.

Пример кода.

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

Или вы можете убрать только начальные или конечные пробелы.