Класс string в java
Содержание:
- Преобразование к строковому типу
- Метод String.format() и класс StringFormatter
- Разделение
- Теговые шаблоны
- JSON
- Добавление текста в конец
- Подстроки
- compareTo()
- Извлекаем символы и подстроки в Java
- Как отсортировать список строк по их длине в Java 7 и 8
- Java string методы — использование оператора ==
- Преимущества Java-программирования
- Класс Thread
- Как логические операторы работают с целыми числами
- Оператор для сравнения строк «==»
- java.lang.StringBuilder
- Поиск подстроки или символа в строке в Java
- Поиск в строке в Java
- Что такое Java?
- Сравнение строк
- Выравнивание
Преобразование к строковому типу
Как уже говорилось выше, разработчики Java сделали так, что абсолютно все переменные, объекты, выражения в Java можно преобразовать к типу .
Более того, это автоматически происходит, когда мы складываем тип с каким-нибудь другим типом. Примеры:
Команда | Примечание |
---|---|
содержит строку | |
содержит строку | |
содержит строку |
Во всех трех примерах мы спокойно складывали переменные типа и , и в результате всегда получался тип .
Арифметические операции с типом проводить нельзя. Даже если строка целиком состоит из цифр.
Примеры:
Команда | Примечание |
---|---|
содержит строку | |
содержит строку | |
содержит строку |
Операция сложения выполняется слева направо, так что результат может быть несколько неожиданным. Пример:
Команда | Примечание |
---|---|
содержит строку |
Порядок выполнения:
Метод String.format() и класс StringFormatter
И еще один интересный метод класса String — .
Допустим, у вас есть различные переменные с данными. Как вывести их на экран одной строкой? Например, у нас есть данные (левая колонка) и желаемый вывод (правая колонка):
Код | Вывод на экран |
---|---|
Скорее всего, ваш код будет выглядеть примерно так:
Код программы |
---|
Такой код не слишком читабельный. Более того, если бы имена переменных были длиннее, код стал бы еще сложнее:
Код программы |
---|
Не очень читаемо, не так ли?
Однако в реальных программах такая ситуация встречается часто, поэтому я хочу рассказать о способе, как проще и короче записать этот код.
У класса String есть статический метод : он позволяет задать шаблон объединения строки с данными. Общий вид этой команды такой:
Пример:
Код | Результат |
---|---|
В метод первым параметром передают строку-шаблон, которая содержит весь нужный текст, а в местах, где нужно вставлять данные, написаны специальные символы типа , и т.п.
Вот эти и метод и заменяют на параметры, которые идут следом за строкой-шаблоном. Если нужно подставить строку, мы пишем , если число — . Пример:
Код | Результат |
---|---|
будет равна |
Вот краткий список параметров, которые можно использовать внутри шаблона:
Символ | Обозначение |
---|---|
целое число: , , , | |
вещественное число: , | |
Символ |
Эти параметры указывают на тип данных, но есть еще параметры, которые указывают на порядок данных. Чтобы взять параметр по его номеру (нумерация начинается с единицы), нужно записать вместо . Пример:
Код | Результат |
---|---|
будет равна |
возьмет 3-й параметр-переменную, возьмет второй параметр. возьмет самый первый параметр-переменную. Параметры шаблона , обращаются к переменным-параметрам независимо от параметров шаблона типа или
Разделение
Класс Java String содержит метод split(), который можно использовать для разделения String на массив объектов String:
String source = "A man drove with a car."; String[] occurrences = source.split("a");
После выполнения этого кода Java массив вхождений будет содержать экземпляры String:
"A m" "n drove with " " c" "r."
Исходная строка была разделена на символы a. Возвращенные строки не содержат символов a. Символы a считаются разделителями для деления строки, а разделители не возвращаются в результирующий массив строк.
Параметр, передаваемый методу split(), на самом деле является регулярным выражением Java, которые могут быть довольно сложными. Приведенное выше соответствует всем символам, даже буквам нижнего регистра.
Метод String split() существует в версии, которая принимает ограничение в качестве второго параметра – limit:
String source = "A man drove with a car."; int limit = 2; String[] occurrences = source.split("a", limit);
Параметр limit устанавливает максимальное количество элементов, которое может быть в возвращаемом массиве. Если в строке больше совпадений с регулярным выражением, чем заданный лимит, то массив будет содержать совпадения с лимитом – 1, а последним элементом будет остаток строки из последнего среза – 1 совпадением. Итак, в приведенном выше примере возвращаемый массив будет содержать эти две строки:
"A m" "n drove with a car."
Первая строка соответствует регулярному выражению. Вторая – это остальная часть строки после первого куска.
Выполнение примера с ограничением 3 вместо 2 приведет к тому, что эти строки будут возвращены в результирующий массив String:
"A m" "n drove with " " car."
Обратите внимание, что последняя строка по-прежнему содержит символ в середине. Это потому, что эта строка представляет остаток строки после последнего совпадения (a после ‘n водил с’)
Выполнение приведенного выше примера с пределом 4 или выше приведет к тому, что будут возвращены только строки Split, поскольку в String есть только 4 совпадения с регулярным выражением a.
Теговые шаблоны
Теговые шаблоны позволяют создать функцию, которая парсит шаблонную строку.
Это может быть действительно мощным инструментом и наиболее наглядно демонстрируется на примере:
Представьте, что у нас есть функция censor(), которая удаляет любые оскорбительные слова в строке, введенной пользователем.
Когда мы хотим подвергнуть строку цензуре, мы можем вручную вызвать censor() для каждого введенного пользователем значения:
Или мы могли бы использовать теговые шаблоны.
Это позволяет нам написать функцию, которая принимает строковые значения из шаблонной строки и все выражения, используемые в шаблоне:
Обратите внимание, что в последней строке мы «тегаем» строку нашей функцией, добавляя ее перед шаблонной строкой, а не явно вызывая функцию censorStrings(). Это означает, что теперь мы можем управлять шаблонной строкой и значениями внутри неё
Это означает, что теперь мы можем управлять шаблонной строкой и значениями внутри неё.
Теперь у нас есть доступ к шаблонной строке и отдельным аргументам. Мы можем отслеживать каждую переменную, используемую в строке:
Наконец, наша теговая функция должна вернуть обработанную строку.
Для этого мы просто объединяем исходный массив строк и массив (измененных) входных данных в новый массив.
Здесь мы делаем это с помощью .reduce():
Наша теговая функция теперь готова, и ее можно использовать везде, где нам нужно цензурировать вводимые пользователем данные:
Raw-строки в JavaScript
String.raw — это предопределенная теговая функция.
Она позволяет вам получить доступ к строке без обработки каких-либо значений после обратного слэша.
Например, при использовании строки, содержащей \ n с String.raw, вместо получения новой строки вы получите фактические символы \ и n:
Это может быть полезно (помимо прочего) для написания строк, в которых вам обычно приходится избегать большого количества символов обратного слэша, таких как пути к файлам:
При использовании string.raw символ \ экранирует последнюю обратную кавычку.
Это означает, что вы не можете заканчивать raw-строку символом \ следующим образом:
JSON
Сериализация и Десериализация
JSON — невероятно удобный и полезный синтаксис для хранения и обмена данными. Java полностью поддерживает это.
Прим. перев. Для использования JSON из примера необходимо подключить библиотеку JSON Simple.
Вы можете сериализовать данные следующим образом:
Получается следующая строка JSON:
Десериализация в Java выглядит так:
Используемый в примере файл JSON (jsonDemoFile.json):
Прим. перев. В Java проектах очень часто для работы с JSON используют библиотеки Gson от Google или Jackson. Обе библиотеки очень популярны и хорошо поддерживаются. Попробуйте и их.
Добавление текста в конец
-
Метод читает символы текста сопоставителя и присоединяет их в конец объекта , на который ссылается аргумент . Этот метод прекращает чтение на последнем символе, предшествующем предыдущему соответствию шаблону. Далее, метод добавляет символы из объекта типа , на который ссылается аргумент , в конец объекта (строка может содержать ссылки на текстовые последовательности, захваченные во время предыдущего поиска; они указываются при помощи символов и номеров захватываемых групп). Наконец, метод устанавливает значение позиции сопоставителя для добавления в конец равным позиции последнего совпавшего символа плюс единица, после чего возвращает ссылку на текущий сопоставитель.
Метод генерирует исключение , если сопоставитель еще не находил соответствия или предыдущая попытка поиска завершилась неудачно. Он генерирует исключение , если строка задает отсутствующую в шаблоне захватываемую группу).
Метод добавляет весь текст в объект и возвращает ссылку на этот объект. После последнего вызова метода , вызовите метод , чтобы скопировать оставшийся текст в объект .
Захватываемые группы |
---|
Как вы помните из части 1, захватываемая группа — это последовательность символов, заключенная в метасимволы круглых скобок (). Цель этой конструкции состоит в сохранении найденных символов для дальнейшего повторного использования во время поиска по шаблону. Все символы из захватываемой группы рассматриваются во время поиска по шаблону как единое целое. |
Подстроки
Вы можете извлечь часть строки – подстроку с помощью метода substring() класса String:
String string1 = "Hello World"; String substring = string1.substring(0,5);
После выполнения этого кода переменная substring будет содержать строку Hello.
Метод substring() принимает два параметра. Первый – это индекс символа первого символа, который будет включен в подстроку. Второй – это индекс последнего символа для включения в подстроку. Параметры означают «от – в том числе до -».
Первый символ в строке имеет индекс 0, второй символ имеет индекс 1 и т. д. Последний символ в строке имеет индекс String.length() – 1.
compareTo()
Метод compareTo() сравнивает строку с другой и возвращает int, сообщающий, меньше ли эта строка, равна или больше другой.
- Если строка в порядке сортировки раньше, чем другая, возвращается отрицательное число.
- совпадает с другой, возвращается 0.
- Если находится после другой в порядке сортировки, выводит положительное число.
Вот пример:
String one = "abc"; String two = "def"; String three = "abd"; System.out.println( one.compareTo(two) ); System.out.println( one.compareTo(three) );
В этом примере сравнивается одна строка с двумя другими. Вывод:
-3 -1
Числа отрицательны, потому что одна строка находится в порядке сортировки раньше, чем две другие.
Метод compareTo() фактически принадлежит интерфейсу Comparable.
Извлекаем символы и подстроки в Java
Чтобы извлечь символы по индексу, в классе String есть метод char charAt(int index). Этот метод принимает индекс, по которому необходимо получить символы, возвращая извлеченный символ:
String str = "Java"; char c = str.charAt(2); System.out.println(c); // v
Обратите внимание, что индексация начинается с нуля, впрочем, как и в массивах. Если же нужно извлечь сразу группу символов либо подстроку, подойдёт getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Этот метод принимает ряд параметров:
• srcBegin: индекс в нашей строке, с которого осуществляется начало извлечения символов;
• srcEnd: индекс в нашей строке, до которого осуществляется извлечение символов;
• dst: массив символов (именно в него будут эти символы извлекаться);
• dstBegin: индекс в массиве dst (с него надо добавлять символы, извлечённые из строки).
String str = "Hi world!"; int start = 6; int end = 11; char[] dst=new charend - start]; str.getChars(start, end, dst, ); System.out.println(dst); // world
Как отсортировать список строк по их длине в Java 7 и 8
Ниже приведен пример использования этого компаратора длины строк для сортировки списка строк по их длине. В этом примере мы продемонстрировали программы на JDK 6 и 7 с использованием анонимного класса, и новый способ с использованием лямбда-выражений, который доступен в Java 8. Он занимает всего одну строку и его намного проще понять, если вы знакомы с синтаксисом лямбда-выражений.
Как отсортировать список строк по их длине в Java 7 и 8
Java 6, 7
Import java.util.ArrayList; Import java.util.Arrays; Import java.util.Collections; Import java.util.Comparator; Import java.util.List; / * * Программа Java для сортировки списка строк по их длине * / public class StringComparisonByLength{ Public static void main (String [] args) { List<String> books = new ArrayList<>(Arrays.asList("Effective Java", "Algorithms", "Refactoring" )); System.out.println("Sorting List of String by length in JDK 7 ======"); System.out.println("The original list without sorting"); System.out.println(books); Comparator<String> byLength = new Comparator<String>(){ @Override Public int compare (String s1, String s2) { Return s1.length () - s2.length (); } }; Collections.sort(books, byLength); System.out.println("The same list after sorting string by length"); System.out.println(books); } }
Результат
Sorting List of String by length in JDK 7 ====== The original list without sorting The same list after sorting string by length
Java 8
Import java.util.ArrayList; Import java.util.Arrays; Import java.util.Comparator; Import java.util.List; / * * Программа Java для сортировки списка строк по их длине в JDK 8 * / public class SortingListOfStringByLength{ public static void main(String[] args) { // В Java 8 System.out.println("Sorting List of String by length in Java 8 ======"); List<String> cities = new ArrayList<>(Arrays.asList("London", "Tokyo", "NewYork")); System.out.println("The original list without sorting"); System.out.println(cities); cities.sort((first, second) -> Integer.compare(first.length(), second.length())); System.out.println("The same list after sorting string by length"); System.out.println(cities); } }
Результат
Sorting List of String by length in Java 8 ====== The original list without sorting The same list after sorting string by length
Это все, что касается сравнения длины строк Java и сортировки списка String по длине в Java 7 и Java 8. В последней версии языка делать это намного удобнее, поскольку можно создать пользовательский компаратор только одной строкой, используя лямбда-выражение. API JDK 8 содержит множество подобных методов, которые облегчают еще более сложные сравнения. Например, используя метод thenComparing(), можно связать несколько компараторов.
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
Преимущества Java-программирования
Независимость от архитектуры и платформы. Вы пишете код, не задумываясь об особенностях операционной системы или процессора. Всё это берёт на себя виртуальная машина, а вы только пишете логику работы.
Объектно-ориентированное программирование. ООП — это современный стандарт программирования в коммерческих и промышленных системах. В случае с Java это получится само собой: дело в том, что, как и Ruby, Java — чистый ООП-язык. В нём даже функции превратились в методы и могут существовать только внутри класса.
Работа с памятью. Программисту не нужно следить за тем, сколько памяти расходует его программа и как её освободить, когда какая-то переменная больше не нужна. Для этого в Java встроено автоматическое управление памятью: Java не допускает её утечек и разрастания объёма, а после завершения программы освобождает все ресурсы.
Безопасность. Виртуальная машина сама следит за тем, чтобы программа не получила доступ к тому, что выходит за её полномочия. Например, Java-программа не сможет прочитать содержимое остальной оперативной памяти или связаться с другим компьютером, если это не предусмотрено изначальными правами доступа.
Большое сообщество и поддержка. Java — третий по популярности язык программирования в мире. В Сети есть тысячи сайтов, которые рассказывают об этом языке, помогают разобраться в коде или содержат готовые решения.
Стандарт в корпоративном программировании. Большим компаниям в программах нужна надёжность, стабильность работы и возможность поддерживать их долгое время. Сочетание ООП, управления памятью и независимости от архитектуры делает Java идеальным решением для этого.
Класс Thread
В Java функциональность отдельного потока заключается в классе Thread. И чтобы создать новый поток, нам надо создать
объект этого класса. Но все потоки не создаются сами по себе. Когда запускается программа, начинает работать главный поток этой программы.
От этого главного потока порождаются все остальные дочерние потоки.
С помощью статического метода Thread.currentThread() мы можем получить текущий поток выполнения:
public static void main(String[] args) { Thread t = Thread.currentThread(); // получаем главный поток System.out.println(t.getName()); // main }
По умолчанию именем главного потока будет .
Для управления потоком класс Thread предоставляет еще ряд методов. Наиболее используемые из них:
-
getName(): возвращает имя потока
-
setName(String name): устанавливает имя потока
-
getPriority(): возвращает приоритет потока
-
setPriority(int proirity): устанавливает приоритет потока. Приоритет является одним из ключевых факторов для выбора
системой потока из кучи потоков для выполнения. В этот метод в качестве параметра передается числовое значение приоритета — от 1 до 10.
По умолчанию главному потоку выставляется средний приоритет — 5. -
isAlive(): возвращает true, если поток активен
-
isInterrupted(): возвращает true, если поток был прерван
-
join(): ожидает завершение потока
-
run(): определяет точку входа в поток
-
sleep(): приостанавливает поток на заданное количество миллисекунд
-
start(): запускает поток, вызывая его метод
Мы можем вывести всю информацию о потоке:
public static void main(String[] args) { Thread t = Thread.currentThread(); // получаем главный поток System.out.println(t); // main }
Консольный вывод:
Thread
Первое будет представлять имя потока (что можно получить через ), второе значение 5 предоставляет приоритет
потока (также можно получить через ), и последнее представляет имя группы потоков, к которому относится текущий — по умолчанию также main
(также можно получить через )
Недостатки при использовании потоков
Далее мы рассмотрим, как создавать и использовать потоки. Это довольно легко. Однако при создании многопоточного приложения нам следует учитывать ряд обстоятельств,
которые негативно могут сказаться на работе приложения.
На некоторых платформах запуск новых потоков может замедлить работу приложения. Что может иметь большое значение, если нам критичная производительность
приложения.
Для каждого потока создается свой собственный стек в памяти, куда помещаются все локальные переменные и ряд других данных, связанных с выполнением
потока. Соответственно, чем больше потоков создается, тем больше памяти используется. При этом надо помнить, в любой системе размеры используемой памяти ограничены.
Кроме того, во многих системах может быть ограничение на количество потоков. Но даже если такого ограничения нет, то в любом случае
имеется естественное ограничение в виде максимальной скорости процессора.
НазадВперед
Как логические операторы работают с целыми числами
Мы уже знаем, что логические операции применимы к логическим аргументам (операндам). Каждый логический операнд — это выражение, которое является истинным (true) или ложным (false) — то есть возвращает булево значение. Иными словами, логический операнд — это выражение типа boolean.
Выходит, применять логические операторы к целочисленным аргументам нельзя?
Можно. Внутри Java все целочисленные типы представлены двоичными числами разной длины. И к ним уже применимы бинарные логические операторы ^, | и &.
Только в этом случае они работают с двоичным представлением операндов — выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и & зовутся побитовыми.
Как ^, | и & работают с целочисленными операндами
Рассмотрим пример:
Чтобы повторить вычисления Java, нужно:
- Перевести значения обоих операндов в двоичную систему счисления.
- Расположить результаты перевода друг под другом.
- Сравнять в них число разрядов (дополнить лидирующими нулями).
- Применить к битам из каждого столбца оператор (&, | или ^).
- Записать результат каждой операции ниже в том же столбце.
- Перевести итог в десятичную форму.
Потренируемся: вычислим сами 3 & 5
Число 3 в двоичной системе счисления имеет вид 11, а число 5 — 101.
Так как у числа 5 три разряда в двоичной системе, а у числа 3 — всего два, добавим лидирующий ноль к числу 3 в двоичной системе и получим 011.
Берём цифры из обоих чисел и применяем к ним попарно оператор & (AND):
3(10) = 011(2) | 1 | 1 | |
& | & | & | |
5(10) = 101(2) | 1 | 1 | |
= | = | = | |
001(2) = 1(10) | 1 |
Оператор для сравнения строк «==»
В первую очередь, надо сказать, что этот оператор проверяет и сравнивает не значения, а ссылки. С его помощью вы сможете проверить, являются ли сравниваемые вами элементы одним и тем же объектом. Когда 2 переменные String указывают на тот же самый объект в памяти, сравнение вернёт true, в обратном случае — false.
"Java" == "Java" //true
В примере выше литералы интернируются компилятором, в результате чего ссылаются на один и тот же объект.
new String("Java") == "Java" // false
Вышеприведённые переменные String указывают уже на различные объекты.
new String("Java") == new String("Java") // false
Здесь тоже вышеприведенные переменные String указывают на различные объекты.
Итак, мы видим, что оператор == по сути, сравнивает не две строки, а лишь ссылки, на которые указывают строки.
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
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 числа».
Поиск подстроки или символа в строке в Java
В класс включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода — и .
— ищет первое вхождение символа или подстроки.
— ищет последнее вхождение символа или подстроки.
Каждый из этих методов возвращает индекс того символа, который вы хотели найти, либо индекс начала искомой подстроки. В любом случае, если поиск оказался неудачным, методы возвращают значение -1.
Чтобы найти первое или последнее вхождение символа, применяйте:
Здесь символ, который нужно искать. Чтобы найти первое или последнее вхождение подстроки, применяйте:
Вы можете указать начальную позицию для поиска, воспользовавшись следующими формами:
Рассмотрим применение этих методов на следующем примере:
Поиск в строке в 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
Чтобы определить, начинается строка с определённой подстроки, применяют метод startsWith(). Что касается метода endsWith(), то он даёт возможность определить оканчивается ли строка на определенную подстроку:
String str = "myfile.exe"; boolean start = str.startsWith("my"); //true boolean end = str.endsWith("exe"); //true
Что такое Java?
Java-это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems в 1990-х годах (позже купленной Oracle).
Понятие «объектно-ориентированный» относится к способу написания структурного кода Java, а именно: разделение кода на так называемые «классы», которые запускаются вместе, чтобы обеспечить согласованное порождение объектов. Мы обсудим это позже, но достаточно сказать, что это приводит к универсальному и организованному коду, который легко редактировать и перепрофилировать.
Java находится под влиянием C и C++, поэтому она имеет много общего с этими языками (и C#). Одним из больших преимуществ Java является то, что он «платформенно-независимый». Это означает, что код, который вы пишете на одной платформе, можно легко запустить на другой. Это называется принципом «пишем один раз, запускаем где угодно» (хотя на практике это не всегда так просто, как кажется).
Чтобы запустить и использовать Java, вам нужно три вещи:
- JDK – Java Development Kit
- JRE – Java Runtime Environment
- JVM – Java Virtual Machine
Виртуальная машина Java (JVM) гарантирует, что у ваших приложений Java есть доступ к минимальным ресурсам, необходимым для их запуска. Именно благодаря JVM программы Java так легко запускаются на разных платформах.
Митап «Как стать PHP-разработчиком с нуля»
9 июня в 16:00, Онлайн, Беcплатно
tproger.ru
События и курсы на tproger.ru
Среда исполнения Java (JRE) предоставляет собой «контейнер» для всех этих элементов и кода для запуска приложения. JDK – это «компилятор», который интерпретирует сам код и выполняет его. В JDK также есть инструменты разработчика, необходимые для написания кода Java (как и следует из названия).
Хорошая новость заключается в том, что разработчикам нужно только позаботиться о загрузке JDK, поскольку он поставляется вместе с двумя другими компонентами.
Сравнение строк
Для простого сравнения
строк используются методы equals() (с учетом регистра) и equalsIgnoreCase()
(без учета регистра). Оба метода в качестве параметра принимают строку, с
которой сравниваются:
String str1 = "Hello"; String str2 = "hello"; System.out.println(str1.equals(str2)); // false System.out.println(str1.equalsIgnoreCase(str2)); // true
Обратите
внимание, что в отличие сравнения числовых и других данных примитивных типов
для сравнения строк не рекомендуется использовать оператор ==. То есть,
записывать вот такое сравнение лучше не использовать:
if(str1 == str2) System.out.println("Сроки равны");
(хотя, оно тоже
будет работать). Вместо этого следует использовать метод equals() класса String.
Другая пара методов:
int compareTo(String str) и int compareToIgnoreCase(String str)
также сравнивают
строки между собой, но в отличие от equals() они еще
позволяют узнать больше ли одна строка другой или нет. Если возвращаемое
значение этих методов больше 0, то первая строка больше второй, если меньше
нуля, то, наоборот, вторая больше первой. Если строки равны, то возвращается 0.
Для определения
больше или меньше одна строка, чем другая, используется лексикографический
порядок. То есть, например, строка «A» меньше, чем строка
«B», так как символ ‘A’ в алфавите стоит перед символом ‘B’. Если
первые символы строк равны, то в расчет берутся следующие символы. Например:
String str1 = "hello"; String str2 = "world"; String str3 = "hell"; System.out.println(str1.compareTo(str2)); // -15 - str1 меньше чем str2 System.out.println(str1.compareTo(str3)); // 1 - str1 больше чем str3 System.out.println(str1.compareTo(str1)); // 0 - str1 равна str1
Еще один
специальный метод
regionMatches()
сравнивает
отдельные подстроки в пределах двух строк. Он имеет такие реализации:
boolean
regionMatches(int toffset, String other, int oofset, int len)
boolean
regionMatches(boolean ignoreCase, int toffset, String other, int oofset, int
len)
-
ignoreCase:
надо ли игнорировать регистр символов при сравнении (если значение true, то регистр
игнорируется); -
toffset:
начальный индекс в вызывающей строке, с которого начнется сравнение; -
other:
строка, с которой сравнивается вызывающая; -
oofset: начальный
индекс в сравниваемой строке, с которого начнется сравнение; -
len: количество
сравниваемых символов в обеих строках.
Например, ниже в
строке str1 сравнивается
подстрока wor с подстрокой wor строки str2:
String str1 = "Hello world"; String str2 = "I work"; boolean result = str1.regionMatches(6, str2, 2, 3); System.out.println(result); // true
Выравнивание
Для предотвращения ситуаций ложного совместного использования строки кэша (cache-line false sharing) размер объекта в Hotspot выравнивается по 8 байтовой границе. То есть если объект будет занимать даже 1 байт под него выделится 8 байт. Размер границы выравнивания выбирается таким образом, чтобы строка кэша была кратна этой границе, а также эта граница должна быть степенью двойки, а также кратна машинному слову. Так как у большинства современных процессоров размер строки кэша составляет 64 байта, а размер машинного слова — 4/8 байт, то размер границы был выбран равным 8 байт. В файле globalDefinitions.hpp есть соответствующие определения (строки 372 — 390). Здесь не буду приводить, интересующиеся могут сходить и посмотреть.
Начиная с версии jdk6u21 размер выравнивания стал настраиваемым параметром. Его можно задать при помощи параметра . Допустимы значения 8 и 16.