Resumindo: strip()
é a evolução "ciente do Unicode" de trim()
.
CSR: JDK-8200378
Problema
String :: trim existe desde os primeiros dias do Java, quando o Unicode não tinha evoluído totalmente para o padrão que usamos amplamente hoje.
A definição de espaço usada por String :: trim é qualquer ponto de código menor ou igual ao ponto de código de espaço (\ u0020), comumente referido como caracteres de controle ASCII ou ISO.
Rotinas de corte compatíveis com Unicode devem usar Character :: isWhitespace (int).
Além disso, os desenvolvedores não foram capazes de remover especificamente o espaço em branco de indentação ou remover especificamente o espaço em branco à direita.
Solução
Introduzir métodos de corte que reconhecem o espaço em branco Unicode e fornecem controle adicional de apenas à esquerda ou apenas à direita.
Uma característica comum desses novos métodos é que eles usam uma definição de "espaço em branco" diferente (mais recente) do que os métodos antigos, como String.trim()
. Bug JDK-8200373 .
O JavaDoc atual para String :: trim não deixa claro qual definição de "espaço" está sendo usada no código. Com métodos de corte adicionais chegando em um futuro próximo que usam uma definição diferente de espaço, o esclarecimento é fundamental. String :: trim usa a definição de espaço como qualquer ponto de código menor ou igual ao ponto de código do caractere de espaço (\ u0020.) Os métodos de corte mais recentes usarão a definição de espaço (em branco) como qualquer ponto de código que retorna verdadeiro quando passado para o Predicado Character :: isWhitespace.
O método isWhitespace(char)
foi adicionado Character
com o JDK 1.1, mas o método isWhitespace(int)
não foi apresentado à Character
classe até o JDK 1.5. O último método (aquele que aceita um parâmetro de tipo int
) foi adicionado para oferecer suporte a caracteres suplementares. Os comentários Javadoc para a Character
classe definem caracteres suplementares (normalmente modelados com "ponto de código" baseado em int) versus caracteres BMP (normalmente modelados com um único caractere):
O conjunto de caracteres de U + 0000 a U + FFFF às vezes é chamado de Plano multilíngue básico (BMP). Os caracteres cujos pontos de código são maiores que U + FFFF são chamados de caracteres suplementares. A plataforma Java usa a representação UTF-16 em arrays char e nas classes String e StringBuffer. Nesta representação, caracteres suplementares são representados como um par de valores char ... Um valor char, portanto, representa pontos de código Basic Multilingual Plane (BMP), incluindo os pontos de código substitutos ou unidades de código da codificação UTF-16. Um valor int representa todos os pontos de código Unicode, incluindo pontos de código suplementares. ... Os métodos que aceitam apenas um valor char não podem suportar caracteres suplementares. ... Os métodos que aceitam um valor int oferecem suporte a todos os caracteres Unicode, incluindo caracteres suplementares.
Conjunto de alterações do OpenJDK .
Comparação de benchmark entre trim()
e strip()
- Por que String.strip () é 5 vezes mais rápido que String.trim () para string em branco em Java 11
Aqui está um teste de unidade que ilustra a resposta de @MikhailKholodkov, usando Java 11.
(Observe que
\u2000
está acima\u0020
e não é considerado espaço em branco portrim()
)fonte
Em geral, ambos os métodos removem os espaços iniciais e finais da string. No entanto, a diferença surge quando trabalhamos com caracteres Unicode ou recursos multilíngues.
trim () remove todos os caracteres iniciais e finais cujo valor ASCII seja menor ou igual a 32 ('U + 0020' ou espaço).
De acordo com os padrões Unicode, existem vários caracteres de espaço com valor ASCII superior a 32 ('U + 0020'). Ex: 8193 (U + 2001).
Para identificar esses caracteres de espaço, o novo método isWhitespace (int) foi adicionado do Java 1.5 na classe Character. Este método usa Unicode para identificar caracteres de espaço. Você pode ler mais sobre caracteres de espaço Unicode aqui .
A nova faixa de método que é adicionada no java 11 usa esse método Character.isWhitespace (int) para cobrir uma ampla gama de caracteres de espaço em branco e removê-los.
exemplo
Resultado
Observação: se você estiver executando em uma máquina Windows, pode não ser capaz de ver uma saída semelhante devido ao conjunto limitado de Unicode. você pode tentar alguns compiladores online para testar este código.
referência: diferença entre o método trim e strip java
fonte