¿Cuál es la forma más eficaz de hacer el primer carácter de una String
minúscula?
Puedo pensar en varias formas de hacer esto:
Usando charAt()
consubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
O usando una char
matriz
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Estoy seguro de que hay muchas otras formas excelentes de lograrlo. ¿Que recomiendas?
c[0] |= ' ';
Respuestas:
Probé los enfoques prometedores utilizando JMH . Código de referencia completo .
Supuesto durante las pruebas (para evitar comprobar los casos de las esquinas cada vez): la longitud de la cadena de entrada es siempre mayor que 1.
Resultados
La puntuación son operaciones por segundo, cuanto más, mejor.
Pruebas
test1
fue el primer enfoque de Andy e Hllink:test2
fue el segundo acercamiento de Andy. También loIntrospector.decapitalize()
sugiere Daniel, pero sin dosif
declaraciones. Primeroif
se eliminó debido al supuesto de prueba. El segundo fue eliminado porque violaba la corrección (es decir, la entrada"HI"
volvería"HI"
). Este fue casi el más rápido.test3
era una modificación detest2
, pero en lugar deCharacter.toLowerCase()
, estaba agregando 32, que funciona correctamente si y solo si la cadena está en ASCII. Este fue el más rápido.c[0] |= ' '
del comentario de Mike dio la misma actuación.test4
utilizadoStringBuilder
.test5
utilizó dossubstring()
llamadas.test6
usa la reflexión para cambiarchar value[]
directamente en String. Este fue el más lento.Conclusiones
Si la longitud de la cadena es siempre mayor que 0, utilice
test2
.Si no es así, tenemos que comprobar los casos de las esquinas:
Si está seguro de que su texto siempre estará en ASCII y está buscando un rendimiento extremo porque encontró este código en el cuello de botella, use
test3
.fuente
Encontré una buena alternativa si no desea utilizar una biblioteca de terceros:
fuente
Cuando se trata de manipulación de cadenas, eche un vistazo a Jakarta Commons Lang StringUtils .
fuente
Si desea utilizar Apache Commons, puede hacer lo siguiente:
Resultado: someString
fuente
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
A pesar de un enfoque orientado a caracteres, sugeriría una solución orientada a cadenas. String.toLowerCase es específico de la configuración regional, por lo que tomaría este problema en cuenta.
String.toLowerCase
es preferir las minúsculas de acuerdo con Character.toLowerCase . Además, una solución orientada a caracteres no es totalmente compatible con Unicode, porque Character.toLowerCase no puede manejar caracteres suplementarios.ACTUALIZACIÓN: Como ejemplo, cuán importante es la configuración regional, déjenos en minúsculas
I
en turco y alemán:generará dos resultados diferentes:
fuente
Las cadenas en Java son inmutables, por lo que de cualquier manera se creará una nueva cadena.
Su primer ejemplo probablemente será un poco más eficiente porque solo necesita crear una nueva cadena y no una matriz de caracteres temporal.
fuente
Un método estático muy corto y simple para archivar lo que desea:
fuente
Si lo que necesita es muy simple (por ejemplo, nombres de clases java, sin configuraciones regionales), también puede usar la clase CaseFormat en la biblioteca de Google Guava .
O puede preparar y reutilizar un objeto convertidor, que podría ser más eficiente.
Para comprender mejor la filosofía de la manipulación de cadenas de Google Guava, consulte esta página wiki .
fuente
fuente
Me he encontrado con esto solo hoy. Intenté hacerlo yo mismo de la manera más peatonal. Eso tomó una línea, aunque demasiado larga. Aquí va
Da:
Antes str = TaxoRanks
Después de str = taxoRanks
fuente
Resultado:
fuente