Java string
Содержание:
- String Comparison With Apache Commons
- Получение символов и байтов
- Methods of Java String
- ⇑
- 7. Пример описания и использования переменных с плавающей запятой.
- 8. Какие особенности применения символьного типа данных char?
- 9. Примеры описания и использования переменных типа char
- 10. Какое назначение в программах имеет тип boolean?
- 11. Какие отличия между примитивными типами и типами-ссылками?
- 12. Существуют ли беззнаковые примитивные типы?
- Pad a String Using Libraries
- substring(int beginIndex, int endIndex)
- Java string методы — использование оператора ==
- Обрезка посредством trim()
- Конкатенация — склеивание строк
- Конвертировать с использованием StringBuffer или StringBuilder
- Класс StringTokenizer
- Поиск в строке
- Разбиение строки на подстроки
- Создание подстрок
- Метод String compareTo()
- java.lang.StringBuilder
- Решение 2: когда нужно узнать есть ли в строке данный символ или слово
- Возведение в степень
- Сравнение строк
- StartWith() и EndWith()
- Форматирование строк
- Извлечение символов и подстрок
- Математика
String Comparison With Apache Commons
The Apache Commons library contains a utility class called StringUtils for String-related operations; this also has some very beneficial methods for String comparison.
4.1. Using equals() and equalsIgnoreCase()
The equals() method of StringUtils class is an enhanced version of the String class method equals(), which also handles null values:
The equalsIgnoreCase() method of StringUtils returns a boolean value. This works similarly to equals(), except it ignores casing of characters in Strings:
4.2. Using equalsAny() and equalsAnyIgnoreCase()
The equalsAny() method’s first argument is a String and the second is a multi-args type CharSequence. The method returns true if any of the other given Strings match against the first String case sensitively.
Otherwise, false is returned:
The equalsAnyIgnoreCase() method works similarly to the equalsAny() method, but also ignores casing:
4.3. Using compare() and compareIgnoreCase()
The compare() method in StringUtils class is a null-safe version of the compareTo() method of String class and handles null values by considering a null value less than a non-null value. Two null values are considered equal.
Furthermore, this method can be used to sort a list of Strings with null entries:
The compareIgnoreCase() method behaves similarly, except it ignores casing:
The two methods can also be used with a nullIsLess option. This is a third boolean argument which decides if null values should be considered less or not.
A null value is lower than another String if nullIsLess is true and higher if nullIsLess is false.
Let’s try it out:
The compareIgnoreCase() method with a third boolean argument work similarly, except by ignoring case.
Получение символов и байтов
Можно получить символ по определенному индексу в строке, используя метод charAt():
String theString = "This is a good day to code"; System.out.println( theString.charAt(0) ); System.out.println( theString.charAt(3) );
Этот код распечатает:
T s
Так как это символы, расположенные в индексах 0 и 3 в строке.
Вы также можете получить байтовое представление метода String, используя метод getBytes():
String theString = "This is a good day to code"; byte[] bytes1 = theString.getBytes(); byte[] bytes2 = theString.getBytes(Charset.forName("UTF-8");
Первый вызов getBytes() возвращает байтовое представление строки, используя кодировку набора символов по умолчанию на машине. Набор символов по умолчанию зависит от компьютера, на котором выполняется код. Поэтому обычно лучше явно указать набор символов, который будет использоваться для создания представления байтов (как в следующей строке).
Второй вызов getBytes() возвращает UTF-8-байтовое представление String.
Methods of Java String
Besides those mentioned above, there are various string methods present in Java. Here are some of those methods:
Methods | Description |
---|---|
substring() | returns the substring of the string |
replace() | replaces the specified old character with the specified new character |
charAt() | returns the character present in the specified location |
getBytes() | converts the string to an array of bytes |
indexOf() | returns the position of the specified character in the string |
compareTo() | compares two strings in the dictionary order |
trim() | removes any leading and trailing whitespaces |
format() | returns a formatted string |
split() | breaks the string into an array of strings |
toLowerCase() | converts the string to lowercase |
toUpperCase() | converts the string to uppercase |
valueOf() | returns the string representation of the specified argument |
toCharArray() | converts the string to a array |
⇑
7. Пример описания и использования переменных с плавающей запятой.
float f; // переменная с именем f типа float f = 3.998f; // переменной f присвоить значение 3.998 double d; // переменная с именем d типа double d = -340.349489287; float ff = -3.99f; // инициализация переменной ff типа float double dd = 779303028.3398; // инициализация переменной dd типа double
8. Какие особенности применения символьного типа данных char?
В Java для представления символов введен тип данных char.
Переменные типа char занимают в памяти компьютера 16 бит. Это связано с тем, что для представления символов char в Java используется кодировка Юникод (Unicode). Диапазон допустимых значений этого типа составляет от до 65535.
Использование кодировки Unicode связано с тем, что программы на Java используются во всем мире, то есть в странах, где для представления символа нужно 2 байта (16 бит). Такими странами есть, например, Япония, Китай.
9. Примеры описания и использования переменных типа char
char c; // переменная с именем c типа char c = 'Z'; // присвоение литерала 'Z' c = 90; // c = 'Z' c--; // c = 'Y' char cc = '2'; // инициализация переменной cc значением '2'
10. Какое назначение в программах имеет тип boolean?
Тип boolean предназначен для сохранения логических значений. Переменные типа boolean могут принимать только два значения: true или false.
Пример использования переменных типа boolean.
boolean b; b = true; boolean bb=false; // bb = false bb = 5>4; // bb = true bb = 55==6; // bb = false
11. Какие отличия между примитивными типами и типами-ссылками?
Между примитивными типами и типами-ссылками существуют следующие отличия:
- переменная примитивного типа не является переменной-ссылкой (объектом);
- переменная примитивного типа есть «автоматической» и сохраняется в стеке. Объект (переменная) сохраняется в «куче». Поэтому производительность работы с переменными примитивного типа выше;
- при объявлении переменной примитивного типа не нужно выделять память оператором new;
- переменная примитивного типа напрямую сохраняет свое значение в отличие от переменной-ссылки.
12. Существуют ли беззнаковые примитивные типы?
Нет. В языке Java все примитивные типы являются знаковыми, то есть, могут принимать отрицательные значения.
- Литералы. Идентификаторы. Ключевые слова. Комментарии
- Переменные. Объявление переменных. Инициализация переменных
- Преобразование и приведение типов. Автоматическое продвижение типов в выражениях
Pad a String Using Libraries
And, there are external libraries that already offer padding functionalities.
3.1. Apache Commons Lang
Apache Commons Lang provides a package of Java utility classes. One of the most popular ones is the StringUtils.
To use it, we’ll need to include it into our project by adding to our pom.xml file:
And then we pass the inputString and the length, just like the methods we created. We can also pass the padding character:
Again, the String will be padded with spaces by default or we need to explicitly set another pad character.
There are also corresponding rightPad() methods.
To explore more features of the Apache Commons Lang 3, you can check out our introductory tutorial. If you would like to see other ways of the String manipulation using the StringUtils class, please refer to this article.
3.2. Google Guava
Another library that we can use is Google’s Guava. Of course, we first need to add it to the project by adding :
And then use the Strings class:
There is no default pad character in this method, so we need to pass it every time.
To right pad, we can use padEnd() method.
The Guava library offers much more features and we have covered a lot of them. You can look here for the Guava related articles.
substring(int beginIndex, int endIndex)
Этот метод вернет новый объект String, содержащий подстроку данной строки от указанного startIndex до endIndex. И получит часть String, начиная с данного beginIndex и до указанного endIndex.
public String substring(int beginIndex, int endIndex)
где beginIndex — индекс, с которого нужно начать извлечение возвращаемой подстроки. (включительно) endIndex — индекс, с которого нужно закончить извлечение возвращаемой подстроки. (эксклюзив)
Смысл в том, что мы можем указать, где начинать и заканчивать копирование символов из исходной строки.
public class SubstringTest { public static void main(String[] args) { String testString = "ABCDEFGHIJ"; System.out.println(testString.substring(0,5)); System.out.println(testString.substring(1,5)); System.out.println(testString.substring(2,5)); System.out.println(testString.substring(0,6)); System.out.println(testString.substring(1,6)); System.out.println(testString.substring(2,6)); System.out.println(testString.substring(0,7)); System.out.println(testString.substring(1,7)); System.out.println(testString.substring(2,7)); } }
Вывод
ABCDE BCDE CDE ABCDEF BCDEF CDEF ABCDEFG BCDEFG CDEFG
Вот пример программы, которая примет строку и распечатает все возможные подстроки.
import java.util.Scanner; public class PrintAllSubstring { public static void main(String[] args) { System.out.println("Enter a string:"); Scanner in = new Scanner(System.in); String inputString = in.nextLine(); for (int beginIndex = 0; beginIndex < inputString.length(); beginIndex++) { for (int endIndex = beginIndex + 1; endIndex <= inputString.length(); endIndex++) { System.out.println(inputString.substring(beginIndex, endIndex)); } } } }
И вот результат, предполагающий, что была введена строка wxyz.
Enter a string: wxyz w wx wxy wxyz x xy xyz y yz z
Вот пример того, как получить середину строки с помощью метода substring в алгоритме.
public class MiddleStrTest { public static void main(String[] args) { System.out.println("A --> " + getMiddleString("A")); System.out.println("AB --> " + getMiddleString("AB")); System.out.println("ABC --> " + getMiddleString("ABC")); System.out.println("ABCD --> " + getMiddleString("ABCD")); System.out.println("ABCDE --> " + getMiddleString("ABCDE")); System.out.println("ABCDEF --> " + getMiddleString("ABCDEF")); System.out.println("ABCDEFG --> " + getMiddleString("ABCDEFG")); } private static String getMiddleString(String str) { if (str.length() <= 2) { return str; } int beginIndex = (str.length() - 1) / 2; int endIndex = beginIndex + 2 - (str.length() % 2); return str.substring(beginIndex, endIndex); } }
Вывод
A --> A AB --> AB ABC --> B ABCD --> BC ABCDE --> C ABCDEF --> CD ABCDEFG --> D
Вот пример программы, которая перевернет строку.
public class ReverseTest { public static void main(String[] args) { System.out.println(reverse("ABCDEFG")); } private static String reverse(String str) { if (str.length() <= 1) { return str; } return reverse(str.substring(1)) + str.substring(0, 1); } }
Это выведет обратную строку ABCDEFG: Вот пример программы, которая проверит, является ли строка палиндромом или нет.
public class PalTest { public static void main(String[] args) { System.out.println(palindrome("ABCBA")); System.out.println(palindrome("ABCCBA")); System.out.println(palindrome("ABCCXA")); System.out.println(palindrome("ABCDEFG")); } private static boolean palindrome(String str) { if (str.length() <= 1) { return true; } String first = str.substring(0, 1); String last = str.substring(str.length() - 1); return first.equals(last) && palindrome(str.substring(1, str.length() - 1)); } }
Вывод
true true false false
Оцени статью
Оценить
Средняя оценка / 5. Количество голосов:
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Спасибо за ваши отзыв!
Java string методы — использование оператора ==
Оператор == проверяет ссылки, а не значения. Это означает, что он проверяет, являются ли сравниваемые элементы одним и тем же объектом. Если две переменные String указывают на один и тот же объект в памяти, сравнение возвращает true. В противном случае — false:
"Java" == "Java" //true
Здесь литералы интернируются компилятором и таким образом ссылаются на один и тот же объект:
new String("Java") == "Java" // false
Приведенные выше переменные String указывают на разные объекты:
new String("Java") == new String("Java") // false
Приведенные выше переменные String также указывают на разные объекты.
Оператор ‘==’ не сравнивает строки в java, а только ссылки, на которые они строки.
Пример
class TestClass{ public static void main (String[] args){ // ссылается на один и тот же объект, возвращает true if( "Java" == "Java" ){ System.out.println("Statement is true"); }else{ System.out.println("Statement is false"); } // указывает на другой объект, возвращает false if(new String("Java") == "Java"){ System.out.println("Statement is true"); }else{ System.out.println("Statement is false"); } // указывает на другой объект, возвращает false if(new String("Java") == new String("Java") ){ System.out.println("Statement is true"); }else{ System.out.println("Statement is false"); } } }
Результат
Statement is true Statement is false Statement is false
Обрезка посредством trim()
Класс Java String содержит метод trim(), который может обрезать строковый объект. Предназначен для удаления в начале и конце строки пробелов, табуляцию и переход на новую строку:
String text = " And he ran across the field "; String trimmed = text.trim();
После выполнения этого кода усеченная переменная будет указывать на экземпляр String со значением
"And he ran across the field"
Пробельные символы в начале и конце объекта String были удалены. Символ пробела внутри строки не был затронут. Имеется в виду между первым и последним символом, не являющимся пробелом.
Метод trim() не изменяет экземпляр String. Вместо этого он возвращает новый объект Java String, который равен объекту String, из которого он был создан, но с удаленным пробелом в начале и конце строки.
Метод trim() может быть очень полезен для обрезки текста, введенного пользователем в поля ввода. Например, пользователь может ввести свое имя и случайно поставить дополнительный пробел после последнего слова или перед первым словом. Метод trim() – это простой способ удалить такие лишние пробелы.
Конкатенация — склеивание строк
Есть очень интересная и простая вещь, которую можно делать со строками в Java — их можно склеивать. Такая операция называется конкатенация. Ну или чтобы легче запомнилось — Кон-Котэ-Нация. Хотя часто ее называют «склеивание строк» или даже просто «сложение строк».
Чтобы склеить две строки, нужно использовать знак . Это очень просто:
Конкатенация двух строк
Примеры:
Команда | Примечание |
---|---|
содержит строку | |
содержит строку | |
содержит строку |
Ну и, конечно, одновременно можно складывать много строк, а также складывать строки и переменные.
Примеры:
Команда | Примечание |
---|---|
содержит строку содержит строку содержит строку |
В последнем примере видно, что текст в переменной плохо читается, т.к. в нем не хватает пробелов. Чтобы задать один пробел или несколько, нужно просто написать их в коде и обернуть в двойные кавычки. Это проще, чем кажется:
Строка, содержащая один пробел
Кстати, если между кавычками совсем не оставить места (написать две двойные кавычки подряд), получится так называемая «пустая строка»:
Пустая строка
С одной стороны, она вроде бы и есть, а с другой, при ее выводе на экран ничего не выводится. И при склейке с другими строками ничего не происходит. Эдакий аналог нуля, только для строк.
Конвертировать с использованием StringBuffer или StringBuilder
StringBuilder и StringBuffer – это классы, используемые для объединения нескольких значений в одну строку. StringBuffer является потокобезопасным, но медленным, тогда как StringBuilder не является поточно-ориентированным, но работает быстрее.
Пример 1
class Method5 { public static void main(String args[]) { int number1 = -1234; StringBuilder sb = new StringBuilder(); sb.append(number1); String str1 = sb.toString(); System.out.println("With StringBuilder method: string = " + str1); StringBuffer SB = new StringBuffer(); SB.append(number1); String str2 = SB.toString(); System.out.println("With StringBuffer method: string = " + str2); } }
Вывод
With StringBuilder method: string = -1234 With StringBuffer method: string = -1234
Объект StringBuilder представляет объект String, который можно изменять и обрабатывать как массив с последовательностью символов. Чтобы добавить новый аргумент в конец строки, экземпляр StringBuilder реализует метод append().
Пример 2
class Method6 { public static void main(String args[]) { String str1 = new StringBuilder().append(1234).toString(); System.out.println("With StringBuilder method: string = " + str1); String str2 = new StringBuffer().append(1234).toString(); System.out.println("With StringBuffer method: string = " + str2); } }
Вывод
With StringBuilder method: string = -1234 With StringBuffer method: string = -1234
Наиболее важным является вызов метода toString(), чтобы получить строковое представление данных.
Класс StringTokenizer
И еще несколько самых частых сценариев работы со строками. Как разбить строку на несколько частей? Для этого есть несколько способов.
Метод
Первый способ разбить строку на несколько частей — использовать метод . В него в качестве параметра нужно передать регулярное выражение: специальный шаблон строки-разделителя. Что такое регулярное выражение, вы узнаете в квесте Java Multithreading.
Пример:
Код | Результат |
---|---|
Результатом будет массив из трех строк: |
Просто, но иногда такой подход избыточен. Если разделителей много, например, «пробел», «enter», «таб», «точка», приходится конструировать достаточно сложное регулярное выражение. Его сложно читать, а значит, в него сложно вносить изменения.
Класс
В Java есть специальный класс, вся работа которого — разделять строку на подстроки.
Этот класс не использует регулярные выражения: вместо этого в него просто передается строка, состоящая из символов-разделителей. Преимущества этого подхода в том, что он не разбивает сразу всю строку на кусочки, а потихоньку идет от начала к концу.
Класс состоит из конструктора и двух методов. В конструктор нужно передать строку, которую мы разбиваем на части, и строку — набор символов, используемых для разделения.
Методы | Описание |
---|---|
Возвращает следующую подстроку | |
Проверяет, есть ли еще подстроки. |
Этот класс чем-то напоминает класс , у которого тоже были методы и .
Создать объект можно командой:
Где строка — это , которую будем делить на части. А — это строка, каждый символ которой считается символом-разделителем. Пример:
Код | Вывод на экран |
---|---|
Обратите внимание, что разделителем считается каждый символ строки, переданный второй строкой в конструктор
Поиск в строке
Метод indexOf() находит
индекс первого вхождения подстроки в строку, а метод lastIndexOf() — индекс
последнего вхождения. Если подстрока не будет найдена, то оба
метода возвращают -1:
String str = "Hello world"; int index1 = str.indexOf('l'); // 2 int index2 = str.indexOf("wo"); //6 int index3 = str.lastIndexOf('l'); //9 System.out.println(index1+" "+index2+" "+index3);
Метод startsWith() позволяют
определить начинается ли строка с определенной подстроки, а метод endsWith() позволяет
определить заканчивается строка на определенную подстроку:
String str = "myfile.exe"; boolean start = str.startsWith("my"); //true boolean end = str.endsWith("exe"); //true System.out.println(start+" "+end);
Разбиение строки на подстроки
Метод split()
позволяет разбить строку на подстроки по определенному разделителю. Разделитель
– это какой-нибудь символ или набор символов (передается в качестве параметра).
Например, разобьем текст на отдельные слова (учитывая, что слова разделены
пробелом):
String text = "Я люблю язык Java!"; String words = text.split(" "); for(String word words) System.out.println(word);
Видео по теме
#1 Установка пакетов и первый запуск программы
#2 Структура программы, переменные, константы, оператор присваивания
#3 Консольный ввод/вывод, импорт пакетов
#4 Арифметические операции
#5 Условные операторы if и switch
#6 Операторы циклов while, for, do while
#7 Массивы, обработка элементов массива
#8 (часть 1) Строки в Java, методы класса String
#8 (часть 2) Строки — классы StringBuffer и StringBuider
#9 Битовые операции И, ИЛИ, НЕ, XOR
#10 Методы, их перегрузка и рекурсия
Создание подстрок
Кроме сравнения строк и поиска подстрок, есть еще одно очень популярное действие — получение подстроки из строки. В предыдущем примере вы как раз видели вызов метода , который возвращал часть строки.
Вот список из 8 методов получения подстрок из текущей строки:
Методы | Описание |
---|---|
Возвращает подстроку, заданную интервалом символов . | |
Повторяет текущую строку n раз | |
Возвращает новую строку: заменяет символ на символ | |
Заменяет в текущей строке подстроку, заданную регулярным выражением. | |
Заменяет в текущей строке все подстроки, совпадающие с регулярным выражением. | |
Преобразует строку к нижнему регистру | |
Преобразует строку к верхнему регистру | |
Удаляет все пробелы в начале и конце строки |
Вот краткое описание существующих методов:
Метод
Метод возвращает новую строку, которая состоит из символов текущей строки, начиная с символа под номером и заканчивая . Как и во всех интервалах в Java, символ с номером в интервал не входит. Примеры:
Код | Результат |
---|---|
Если параметр не указывается (а так можно), подстрока берется от символа beginIndex и до конца строки.
Метод
Метод repeat просто повторяет текущую строку раз. Пример:
Код | Результат |
---|---|
Метод
Метод возвращает новую строку, в которой все символы заменены на символ . Длина строки при этом не меняется. Пример:
Код | Результат |
---|---|
Методы и
Метод заменяет все вхождения одной подстроки на другую. Метод заменяет первое вхождение переданной подстроки на заданную подстроку. Строка, которую заменяют, задается регулярным выражением. Разбирать регулярные выражения мы будем в квесте Java Multithreading.
Примеры:
Код | Результат |
---|---|
Методы
С этими методами мы познакомились, когда только в первый раз учились вызывать методы класса .
Метод
Метод удаляет у строки пробелы с начала и с конца строки. Пробелы внутри строки никто не трогает. Примеры:
Код | Результат |
---|---|
Метод String compareTo()
Метод compareTo() используется, когда нужно определить порядок строк лексикографически. Он сравнивает значения char аналогично методу equals(). Если две строки точно совпадают, метод compareTo() вернет значение (результат = 0). При сравнении двух строк Java он возвращает положительное (результат > 0) целое число, если первый объект String следует за второй строкой. Метод compareTo() возвращает отрицательный результат (результат < 0), если первый объект String предшествует второй строке:
result1 == result2 :возвращает 0; result1 > result2 :возвращает положительное значение; result1 < result2 : возвращает отрицательное значение.
Пример
class TestClass{ public static void main (String[] args) { String str1 = "Java"; String str2 = "Java"; String str3 = "ASP"; int val = 0; val = str1.compareTo(str2); System.out.println(val); val = str1.compareTo(str3); System.out.println(val); val = str3.compareTo(str1); System.out.println(val); } }
Результат
0 9 -9
Данная публикация является переводом статьи «String Comparison in Java» , подготовленная редакцией проекта.
java.lang.StringBuilder
В отличие от String класс StringBuilder позволяет менять содержимое своих экземпляров. В большинстве случаев нужно использовать
String , использование же
StringBuilder целесообразно в случаях, когда вам нужно соединить большое количество строковых переменных, например перебирая элементы массива или коллекции в цикле.
Так же как и у
String у
StringBuilder есть метод
length() , позволяющий узнать его длину в
char -ах.
В отличие от
String у
StringBuilder кроме длины есть ещё вместимость/ёмкость (capacity). Вместительность можно узнать с помощью метода
capacity() , она всегда больше или равна длине.
Конструктор | Описание |
---|---|
Создаёт пустой StringBuilder вместительностью 16 (16 пустых элементов). |
|
Создаёт StringBuilder , содержащий символы из последовательности и 16 дополнительных пустых элементов. |
|
Создаёт пустой StringBuilder с начальной вместительностью в initCapacity элементов. |
|
Создаёт StringBuilder , который содержит указанную строку и 16 дополнительных пустых элементов. |
StringBuilder содержит пару дополнительных методов, связанных с длиной, которых нет в
String :
Метод | Описание |
---|---|
Устанавливает длину последовательности символов. Если newLength меньше length() , то последние символы обрезаются. Если newLength больше length() , то в конец последовательности добавляются нулевые символы. |
|
Обеспечивает, что вместительность будет как минимум равной minCapacity . |
Некоторые методы могут увеличить длину последовательности символов в
StringBuilder . Если после выполнения подобного метода длина результирующей последовательности окажется больше вместительности, то вместительность автоматически увеличится.
Метод | Описание |
---|---|
Добавляет аргумент, преобразованный в строку, в конец StringBuilder-а. | |
Первый метод удаляет подпоследовательность с start до end-1 включительно. Второй метод удаляет символ по индексу. |
|
Вставляет второй аргумент, конвертированный в строку, в позицию index . |
|
Заменяет указанный символ/ы. | |
Меняет порядок символов в StringBuilder на обратный. Первый символ становится последним и так далее. |
|
Возвращает строку, содержащую последовательность символов из StringBuilder . |
Пример использования StringBuilder:
Java
String andStr = » and Petya»;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(«Vasya»);
stringBuilder.append(andStr);
stringBuilder.append(» go to school.»);
System.out.println(stringBuilder);
1 |
StringandStr=» and Petya»; StringBuilder stringBuilder=newStringBuilder(); stringBuilder.append(«Vasya»); stringBuilder.append(andStr); stringBuilder.append(» go to school.»); System.out.println(stringBuilder); |
Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 автоупаковка и распаковка».
Предыдущая статья — «Java 8 числа».
Решение 2: когда нужно узнать есть ли в строке данный символ или слово
Ниже продемонстрирован пример, который позволяет в Java узнать присутствует ли данный символ или слово в строке.
Строка — это упорядоченная последовательность символов. В Java строка является основным носителем текстовой информации. Для работы со строками здесь используются следующие классы: String, StringBuilder, StringBuffer. В этом уроке речь пойдет о классе String, его на первых порах будет вполне достаточно.
В данном уроке рассматривается:
В уроке 6 уже упоминалась работа со строками, а именно, как создавать строку. Также частично со строками мы встречались в предыдущих уроках. В этом и следующих двух уроках мы углубим знания о строках. В этом уроке будут рассмотрены создание строк в Java и наиболее популярные методы при работе со строками. Следующий урок будет посвящен форматированию строк. И еще один урок будет на тему работы с регулярными выражениями в Java, поскольку регулярные выражения достаточно мощный и нужный инструмент при работе со строками.
Но начнем с самого начала.
Возведение в степень
Возвести число в степень можно двумя способами:
- простое умножение;
- используя метод (двойное основание, двойной показатель степени).
Использование библиотечной функции рекомендуется только в случае крайней необходимости, например, в случае дробной или отрицательной степени.
Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать:
JIT оптимизация
Код Java обрабатывается с использованием JIT-компиляции: сначала он транслируется в платформенно-независимый байт-код, а затем в машинный код. При этом оптимизируется все возможное, и разработчик может помочь компилятору создать максимально эффективную программу.
В качестве примера рассмотрим две простые операции:
Давайте измерим время выполнения каждого из них:
Запустив этот код несколько раз, мы получим примерно следующее:
Схема очевидна: группировка переменных в круглые скобки ускоряет работу программы. Это связано с генерацией более эффективного байт-кода при умножении одинаковых значений.
Вы можете узнать больше об этом эксперименте здесь. Или можете провести свой собственный тест, используя онлайн-компилятор Java.
Сравнение строк
Сравнение — одна из самых частых вещей, которая делается со строками. У класса String более десяти различных методов, которые используются для сравнения строк со строками. Ниже мы рассмотрим семь основных.
Методы | Описание |
---|---|
Строки считаются равными, если все их символы совпадают. | |
Сравнивает строки, игнорируя регистр (размер) букв | |
Сравнивает строки лексикографически. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра | |
Сравнивает строки лексикографически, игнорирует регистр. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра | |
Сравнивает части строк | |
Проверяет, что текущая строка начинается со строки | |
Проверят, что текущая строка заканчивается на строку |
Допустим, вы хотите написать программу, которая просит пользователя ввести путь к файлу и проверяет, что это за файл по его расширению. Тогда код такой программы мог бы выглядеть примерно так:
Код | Примечания |
---|---|
Создание объекта Чтение строки с консоли Проверяем, что строка оканчивается на заданную строку |
StartWith() и EndWith()
Методы StartWith() и EndWith() проверяют, начинается ли String с определенной подстроки:
String one = "This is a good day to code"; System.out.println( one.startsWith("This") ); System.out.println( one.startsWith("This", 5) ); System.out.println( one.endsWith("code") ); System.out.println( one.endsWith("shower") );
В этом примере создается строка и проверяется, начинается ли она и заканчивается ли она различными подстроками.
- Первая строка (после объявления String) проверяет, начинается ли String с подстроки «This». Поскольку это происходит, метод startWith() возвращает true.
- Вторая строка проверяет, начинается ли строка с подстроки «This» при запуске сравнения с символа с индексом 5. Результат равен false, поскольку символ с индексом 5 равен «i».
- Третья строка проверяет, заканчивается ли String подстрокой «code». Поскольку это происходит, метод endWith() возвращает true.
- Четвертая строка проверяет, заканчивается ли String подстрокой “shower”. Так как это не так, метод endWith() возвращает false.
Форматирование строк
Предположим у нас есть строковый ресурс:
Чтобы вывести эту строку программно в элементе TextView, можно использовать код:
Представьте себе, что у вас несколько котов. Можно, конечно, завести для каждого кота свою строку. Но ведь строки очень похожи, меняются только имена и возраст. Также можно менять число лап и хвостов (что вы курите?).
В таких случаях можно применить форматирование строк. Нужно определить слова, которые мы будем менять и заменить их на специальный набор символов, которые начинаются с символа процента, затем идет число, увеличивающееся на единицу, далее $s для строк или $d для чисел. Итак, изменим наш строковой ресурс так:
Внесём изменения в код:
Если вас есть кот Васька и ему шесть лет, то добавляем две переменные и форматируем строку
Здесь показан простейший пример с форматированием. Помните о нём и применяйте в нужных местах.
Извлечение символов и подстрок
Для извлечения
символов по индексу в классе String определен метод
char charAt(int
index)
Он принимает
индекс, по которому надо получить символов, и возвращает извлеченный символ:
String str = "Java"; char c = str.charAt(2); System.out.println(c); // v
(здесь как и в
массивах первый индекс равен 0).
Если надо
извлечь сразу группу символов или подстроку, то можно использовать метод
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Он принимает
следующие параметры:
-
srcBegin:
индекс строки, с которого начинается извлечение символов; -
srcEnd:
индекс строки, до которого идет извлечение символов; -
dst:
массив символов, в который будут извлекаться символы; -
dstBegin:
индекс массива dst, с которого надо добавлять извлеченные из строки символы.
String str = "Hello world!"; int start = 6; int end = 11; char dst=new charend - start; str.getChars(start, end, dst, ); System.out.println(dst); // world
Математика
Float или Double?
Программисты часто не могут выбрать необходимую точность для чисел с плавающей запятой. Float требует всего 4 байта, но имеет только 7 значащих цифр, а Double в два раза точнее (15 цифр), но в два раза прожорливее.
Фактически, большинство процессоров могут одинаково эффективно работать как с Float, так и с Double, поэтому воспользуйтесь рекомендацией Бьорна Страуструпа (автор языка С++):
Проверка на нечетность
Можно ли использовать этот код для точного определения нечетного числа?
Надеюсь, вы заметили хитрость. Если мы решим таким образом проверить отрицательное нечетное число (например, -5), остаток от деления не будет равен единице, поэтому воспользуйтесь более точным методом:
Он не только решает проблему отрицательных чисел, но и работает более производительно, чем предыдущий метод. Арифметические и логические операции выполняются намного быстрее, чем умножение и деление.