Какой самый эффективный способ сделать первый символ String
нижнего регистра?
Я могу придумать несколько способов сделать это:
Использование charAt()
сsubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Или используя char
массив
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Я уверен, что есть много других отличных способов добиться этого. Что вы порекомендуете?
c[0] |= ' ';
Ответы:
Я протестировал перспективные подходы с помощью JMH . Полный код теста .
Предположение во время тестов (чтобы не проверять каждый раз угловые случаи): длина входной строки всегда больше 1.
Полученные результаты
Счетчик операций в секунду, чем больше, тем лучше.
Тесты
test1
был первым подходом Энди и Хллинка:test2
был второй подход Энди. Это такжеIntrospector.decapitalize()
предлагает Даниил, но без двухif
утверждений. Первыйif
был удален из-за предположения о тестировании. Второй был удален, потому что он нарушал правильность (т.е. ввод"HI"
возвращался"HI"
). Это было почти самым быстрым.test3
был модификациейtest2
, но вместо этогоCharacter.toLowerCase()
я добавил 32, который работает правильно тогда и только тогда, когда строка находится в ASCII. Это было самым быстрым.c[0] |= ' '
из комментария Майка дал такую же производительность.test4
б / уStringBuilder
.test5
использовал дваsubstring()
звонка.test6
использует отражение для измененияchar value[]
непосредственно в String. Это было самым медленным.Выводы
Если длина строки всегда больше 0, используйте
test2
.Если нет, мы должны проверить угловые случаи:
Если вы уверены, что ваш текст всегда будет в формате ASCII, и вам нужна максимальная производительность, потому что вы нашли этот код в узком месте, используйте
test3
.источник
Я наткнулся на хорошую альтернативу, если вы не хотите использовать стороннюю библиотеку:
источник
Когда дело доходит до манипуляций со строками, обратите внимание на Jakarta Commons Lang StringUtils .
источник
Если вы хотите использовать Apache Commons, вы можете сделать следующее:
Результат: someString
источник
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
Несмотря на подход, ориентированный на символы, я бы предложил решение, ориентированное на String. String.toLowerCase зависит от локали , поэтому я хотел бы принять во внимание эту проблему.
String.toLowerCase
предпочтительнее использовать строчные буквы в соответствии с Character.toLowerCase . Также решение, ориентированное на символы, не полностью совместимо с Unicode, потому что Character.toLowerCase не может обрабатывать дополнительные символы.ОБНОВЛЕНИЕ: В качестве примера того, насколько важна настройка локали, давайте сделаем строчные буквы
I
на турецком и немецком языках:выведет два разных результата:
источник
Строки в Java неизменяемы, поэтому в любом случае будет создана новая строка.
Ваш первый пример, вероятно, будет немного более эффективным, потому что ему нужно создать только новую строку, а не временный массив символов.
источник
Очень короткий и простой статический метод архивирования того, что вы хотите:
источник
Если то, что вам нужно, очень простое (например, имена классов java, без локалей), вы также можете использовать класс CaseFormat в библиотеке Google Guava .
Или вы можете подготовить и повторно использовать объект-преобразователь, что может быть более эффективным.
Чтобы лучше понять философию манипуляции строками Google Guava, посетите эту страницу вики .
источник
источник
Я столкнулся с этим только сегодня. Пытался сделать сам по самой пешеходной схеме. Это заняло одну строчку, хотя и длинную. Поехали
Дает:
Перед str = TaxoRanks
После str = taxoRanks
источник
Результат:
источник