Qual é a maneira mais eficiente de fazer o primeiro caractere de uma String
caixa baixa?
Posso pensar em várias maneiras de fazer isso:
Usando charAt()
comsubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Ou usando um char
array
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Tenho certeza de que existem muitas outras maneiras excelentes de se conseguir isso. O que você recomenda?
c[0] |= ' ';
Respostas:
Testei as abordagens promissoras usando JMH . Código de referência completo .
Suposição durante os testes (para evitar a verificação de casos extremos sempre): o comprimento da string de entrada é sempre maior que 1.
Resultados
A pontuação é operações por segundo, quanto mais, melhor.
Testes
test1
foi a primeira abordagem de Andy e Hllink:test2
foi a abordagem do segundo Andy. Também éIntrospector.decapitalize()
sugerido por Daniel, mas sem duasif
afirmações. O primeiroif
foi removido devido à suposição de teste. O segundo foi removido, porque estava violando a correção (ou seja, a entrada"HI"
voltaria"HI"
). Isso foi quase o mais rápido.test3
foi uma modificação detest2
, mas em vez deCharacter.toLowerCase()
, eu estava adicionando 32, que funciona corretamente se e somente se a string estiver em ASCII. Este foi o mais rápido.c[0] |= ' '
do comentário de Mike deu o mesmo desempenho.test4
usadoStringBuilder
.test5
usou duassubstring()
chamadas.test6
usa reflexão para mudarchar value[]
diretamente na String. Este foi o mais lento.Conclusões
Se o comprimento da string for sempre maior que 0, use
test2
.Caso contrário, temos que verificar os casos mais importantes:
Se você tiver certeza de que seu texto estará sempre em ASCII e estiver procurando por desempenho extremo porque encontrou esse código no gargalo, use
test3
.fonte
Eu encontrei uma boa alternativa se você não quiser usar uma biblioteca de terceiros:
fonte
Quando se trata de manipulação de strings, dê uma olhada em Jakarta Commons Lang StringUtils .
fonte
Se você deseja usar o Apache Commons, pode fazer o seguinte:
Resultado: someString
fonte
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
Apesar de uma abordagem orientada para char, eu sugeriria uma solução orientada para String. String.toLowerCase é específico do Locale, então eu levaria esse problema em consideração.
String.toLowerCase
é preferível para letras minúsculas de acordo com Character.toLowerCase . Além disso, uma solução orientada a char não é totalmente compatível com Unicode, porque Character.toLowerCase não pode lidar com caracteres suplementares.ATUALIZAÇÃO: como exemplo de quão importante é a configuração da localidade, vamos usar letras minúsculas
I
em turco e alemão:produzirá dois resultados diferentes:
fonte
Strings em Java são imutáveis, portanto, de qualquer maneira, uma nova string será criada.
Seu primeiro exemplo provavelmente será um pouco mais eficiente, porque ele só precisa criar uma nova string e não uma matriz temporária de caracteres.
fonte
Um método estático muito curto e simples para arquivar o que você deseja:
fonte
Se o que você precisa é muito simples (por exemplo, nomes de classe java, sem localidades), você também pode usar a classe CaseFormat na biblioteca Google Guava .
Ou você pode preparar e reutilizar um objeto conversor, o que pode ser mais eficiente.
Para entender melhor a filosofia de manipulação de strings do Google Guava, verifique esta página wiki .
fonte
fonte
Eu descobri isso apenas hoje. Tentei fazer sozinho da maneira mais pedestre. Isso levou uma linha, embora longa. Aqui vai
Dá:
Antes de str = TaxoRanks
Depois de str = taxoRanks
fonte
Resultado:
fonte