- Длина строки в Java. Метод length()
- Описание метода
- Определяем длину строки в Java
- Сравниваем длины строк в Java
- Количество цифр в целом в Java
- 1. введение
- Дальнейшее чтение:
- Как округлить число до N десятичных знаков в Java
- Проверьте, является ли строка Числовой в Java
- Практическое руководство по десятичному формату
- 2. Количество цифр в целочисленном числе
- 2.1. Решение На основе строк
- 2.2. Логарифмический Подход
- 2.3. Повторное Умножение
- 2.4. Деление на две степени
- 2.5. Разделяй и властвуй
- 3. Бенчмаркинг
- 4. Заключение
Длина строки в Java. Метод length()
В этой статье мы поговорим про метод length() . Он позволяет определять длину строк в Java и сравнивать длины этих строк между собой. Давайте посмотрим, как это делается.
Описание метода
Вышеупомянутый метод length() возвращает длину строки в Java, при этом длина определяется, как равная числу шестнадцатиразрядных Юникод-символов в исследуемой строке. Метод использует довольно простой синтаксис:
Таким образом, возвращается длина последовательности символов. Но давайте лучше посмотрим, как это происходит на примерах.
Определяем длину строки в Java
Итак, у нас есть строка, в которой надо определить длину:
Консольный вывод будет следующим:
Длина строки " Добро пожаловать на сайт Otus.ru!" - 33 Длина строки " Otus.ru" – 7Вы можете проверить работу этого метода самостоятельно, используя любой онлайн-компилятор Java, например, этот.
Сравниваем длины строк в Java
Метод length() позволяет не только узнать длину строк, но и сравнить их длины. Вот, как это можно реализовать:
public class Main < public static void main(String args[]) < // Определяем длины строки s1 и s2. String s1 = "В Otus я стану отличным программистом!"; int len1 = s1.length(); String s2 = "В Otus я стану отличным разработчиком!"; int len2 = s2.length(); // Вывод на экран количества символов в каждой строке. System.out.println( "Длина строки \"В Otus я стану отличным программистом!\": " + len1 + " символов."); System.out.println( "Длина строки \"В Otus я стану отличным разработчиком!\": " + len2 + " символов."); // Сравнение длин строк s1 и s2. if (len1 >len2) < System.out.println( "\nСтрока \"В Otus я стану отличным программистом!\" длиннее строки \"В Otus я стану отличным разработчиком!\"."); >if (len1 < len2)< System.out.println( "\nСтрока \"В Otus я стану отличным программистом!\" короче строки \"В Otus я стану отличным разработчиком!\"."); >else < System.out.println( "\nСтроки \"В Otus я стану отличным программистом!\" и \"В Otus я стану отличным разработчиком!\" равны."); >> >Получим следующий результат:
Длина строки "В Otus я стану отличным программистом!": 38 символов. Длина строки "В Otus я стану отличным разработчиком!": 38 символов. Строки "В Otus я стану отличным программистом!" и "В Otus я стану отличным разработчиком!" равны.В результате метод length() позволяет нам как узнать длину строки, так и сравнить несколько строк. Но, как вы уже заметили, это был простейший код. Если же вы хотите прокачать навыки Java-разработчика на более продвинутом уровне, добро пожаловать на курс не для новичков:
Количество цифр в целом в Java
Изучите различные способы получения количества цифр в целом в Java.
1. введение
В этом кратком руководстве мы рассмотрим различные способы получения количества цифр в целочисленном в Java.
Мы также проанализируем эти различные методы и выясним, какой алгоритм лучше всего подходит для нашей ситуации.
Дальнейшее чтение:
Как округлить число до N десятичных знаков в Java
Проверьте, является ли строка Числовой в Java
Практическое руководство по десятичному формату
2. Количество цифр в целочисленном числе
Для методов, обсуждаемых здесь, мы рассматриваем только положительные целые числа. Если мы ожидаем каких-либо отрицательных входных данных, то мы можем сначала использовать Math.abs(число) перед использованием любого из этих методов.
2.1. Решение На основе строк
Возможно , самый простой способ получить количество цифр в Integer – это преобразовать его в String и вызвать метод length () . Это вернет длину Строки представления нашего числа:
int length = String.valueOf(number).length();Но это может быть неоптимальным подходом, так как этот оператор включает выделение памяти для строки для каждой оценки . JVM должен сначала проанализировать наш номер и скопировать его цифры в отдельную Строку , А также выполнить ряд различных операций (например, сохранение временных копий, обработка преобразований Юникода и т. Д.).
Если у нас есть только несколько чисел для оценки, то мы можем явно пойти с этим решением – потому что разница между этим и любым другим подходом будет пренебрегаться даже для больших чисел.
2.2. Логарифмический Подход
Для чисел, представленных в десятичной форме, если мы возьмем их логин в базе 10 и округлим его, то получим количество цифр в этом числе:
int length = (int) (Math.log10(number) + 1);Обратите внимание, что log 10 0 какого-либо числа не определено. Итак, если мы ожидаем каких-либо входных данных со значением 0 , тогда мы можем проверить и это.
Логарифмический подход значительно быстрее, чем подход на основе String , поскольку ему не нужно проходить процесс преобразования данных. Это просто включает в себя простой, простой расчет без какой-либо дополнительной инициализации объекта или циклов.
2.3. Повторное Умножение
В этом методе мы возьмем временную переменную (инициализированную в 1) и будем непрерывно умножать ее на 10, пока она не станет больше нашего числа. Во время этого процесса мы также будем использовать переменную length , которая будет отслеживать длину числа:
int length = 0; long temp = 1; while (temp return length;В этом коде строка temp совпадает с записью temp = (temp . Поскольку умножение обычно является более дорогостоящей операцией на некоторых процессорах по сравнению с операторами сдвига, последние могут быть немного более эффективными.
2.4. Деление на две степени
Если мы знаем о диапазоне нашего числа, то мы можем использовать вариацию, которая еще больше сократит наши сравнения. Этот метод делит число на степени двух (например, 1, 2, 4, 8 и т. Д.):
Этот метод делит число на степени двух (например, 1, 2, 4, 8 и т. Д.):
int length = 1; if (number >= 100000000) < length += 8; number /= 100000000; >if (number >= 10000) < length += 4; number /= 10000; >if (number >= 100) < length += 2; number /= 100; >if (number >= 10) < length += 1; >return length;Он использует тот факт, что любое число может быть представлено сложением степеней 2. Например, 15 можно представить в виде 8+4+2+1, которые все являются степенями 2.
Для 15-значного числа мы бы провели 15 сравнений в нашем предыдущем подходе, который мы сократили до 4 в этом методе.
2.5. Разделяй и властвуй
Это, возможно, самый громоздкий подход по сравнению со всеми другими, описанными здесь, но излишне говорить, этот самый быстрый , потому что мы не выполняем никакого типа преобразования, умножения, сложения или инициализации объекта.
Мы получаем наш ответ всего в трех или четырех простых утверждениях if :
if (number < 100000) < if (number < 100) < if (number < 10) < return 1; >else < return 2; >> else < if (number < 1000) < return 3; >else < if (number < 10000) < return 4; >else < return 5; >> > > else < if (number < 10000000) < if (number < 1000000) < return 6; >else < return 7; >> else < if (number < 100000000) < return 8; >else < if (number < 1000000000) < return 9; >else < return 10; >> > >Подобно предыдущему подходу, мы можем использовать этот метод только в том случае, если мы знаем о диапазоне нашего числа.
3. Бенчмаркинг
Теперь, когда у нас есть хорошее понимание потенциальных решений, давайте проведем простой бенчмаркинг всех наших методов с использованием жгута Java Microbenchmark (JMH) .
В следующей таблице показано среднее время обработки каждой операции (в наносекундах):
Benchmark Mode Cnt Score Error Units Benchmarking.stringBasedSolution avgt 200 32.736 ± 0.589 ns/op Benchmarking.logarithmicApproach avgt 200 26.123 ± 0.064 ns/op Benchmarking.repeatedMultiplication avgt 200 7.494 ± 0.207 ns/op Benchmarking.dividingWithPowersOf2 avgt 200 1.264 ± 0.030 ns/op Benchmarking.divideAndConquer avgt 200 0.956 ± 0.011 ns/opРешение на основе String , которое является самым простым, также является самой дорогостоящей операцией, поскольку это единственная операция, которая требует преобразования данных и инициализации новых объектов.
Логарифмический подход значительно более эффективен по сравнению с предыдущим решением, поскольку он не требует преобразования данных. И, будучи однострочным решением, это может быть хорошей альтернативой подходу на основе String – .
Повторное умножение включает в себя простое умножение, пропорциональное длине числа; например, если число состоит из пятнадцати цифр, то этот метод будет включать в себя пятнадцать умножений.
Однако самый следующий метод использует тот факт, что каждое число может быть представлено степенями двух (подход, аналогичный BCD), и сводит то же самое к 4 операциям деления, поэтому он еще более эффективен, чем первый.
Наконец, как мы можем заключить, наиболее эффективным алгоритмом является многословная реализация “Разделяй и властвуй” , которая дает ответ всего в трех или четырех простых операторах if. Мы можем использовать его, если у нас есть большой набор данных чисел, которые нам нужно проанализировать.
4. Заключение
В этой краткой статье мы описали некоторые из способов найти количество цифр в целочисленном и сравнили эффективность каждого подхода.
И, как всегда, вы можете найти полный код на GitHub .