Настало время поговорить о работе со строками. Это та самая работа со String, которую я обещал показать в одной из первых статей. В языке Java нет примитивных типов для строк, но есть несколько объектов, которые предназначенные для этого: String, StringBuilder, StringBuffer.
На практике Вы будете больше работать и встречать объект String, как один из самых удобный и наиболее применяемых объектов для работы со строковыми переменными в джава. Именно его функционал мы сегодня и рассмотрим.
Класс String – основной класс представляющий строки
Мы уже создавали строковые переменные и тогда я просил Вас поверить мне на слово и просто писать что-то вроде: String hello = “Hello world”. Это и есть первый способ создать строковую переменную. Второй способ – это создать строку как мы создаем экземпляр класса, новые объекты через ключевое слово new. String hello = new String(“Hello world”). Различия в способах более существенны, чем кажутся на первый взгляд. Для того чтобы понять их нужно немного узнать о распределении памяти.
В языке Java объекты хранятся в куче (heap), а примитивные типы и ссылки на объекты в стеке (stack). Но есть еще такой механизм как пул (pool). Это механизм, если можно так назвать, сохранения строковых переменных для экономии места в памяти. Я нарисовал примерную схему. И попытаюсь объяснить по ней:
Выглядит не очень. Я знаю.
Когда мы создаем строку через ключевое слово new, тогда создается одна строка в пуле и в куче. Если строка создается без ключевого слова new, вот таким образом: String hello = “Hello world” – тогда она создается только в пуле. Если так создать точно такую же строку, новый объект не создается, а две переменные ссылаются на один объект в пуле. Такой механизм пула есть только в объекта String и классов-оберток для примитивных типов (о них мы еще поговорим).
Заметьте, как работает память с другими объектами. На примере объекта Cat видно, что при создании нового объекта с той же самой ссылкой, старый объект уничтожается сборщиком мусора – это специальный механизм в Java, задача которого освобождать память от ненужных объектов (тех на которые потеряна ссылка).
Основные методы строк
Теперь что касается методов со строками. Класс String в этом плане имеет множество полезных методов; наиболее полезные и часто используемые мы сейчас разберем.
- lengtn() – возвращает длину строки;
- charAt(int number) – возвращает символ по указанному индексу. Отсчет идет с 0;
- indexOf(char sumbol) – возвращает индекс по указанному символу. Если символа не найдено возвращается -1;
- substring(int startIndex) – возвращает подстроку строки начиная с указанного индекса;
- substring(int startIndex, int endIndex) – возвращает подстроку строки начиная с указанного индекса и заканчивая указанным индексом;
- startsWith(String sumbolOrSumbols) – возвращает true если строка начинается с указанного слова или символа;
- toLowerCase() – переводит строку в нижний регистр;
- toUpperCase() – переводит строку в верхний регистр;
- replaceAll(String partWhichReplace, String partOnWhichReplace) – заменяет часть строки на заменяемую строку
- equals(String strToCompare) – сравнение строк. Данный метод используется для сравнения объектов не по ссылке, а по содержанию;
- equalsIgnoreCase(String strToCompare) – сравнение без учета регистра;
- trim() – убирает пробелы в конце и в начале строки (если есть);
- toCharArray() – разбивает строку на массив char;
- split(String reqexp) – разбивает строку по заданному символу.
public class StringVariables {
public static void main(String[] args) {
String hello = "Hello world";
System.out.println(hello.length());
System.out.println(hello.charAt(2));//отсчет с 0
System.out.println(hello.indexOf("e"));
System.out.println(hello.indexOf("y"));//-1 так как символа не найдено
System.out.println(hello.substring(3, 6));
System.out.println(hello.startsWith("He"));
System.out.println(hello.toLowerCase());
System.out.println(hello.toUpperCase());
System.out.println(hello.replaceAll("world", "mir"));
String[] stringArray = hello.split("");//разбиение на символы
//по сути метод стал похож на toCharArray
for (int i = 0; i < stringArray.length; i++) {
System.out.print(stringArray[i] + ", ");
}
System.out.println();
String myString = "I;And;Big;Java;Post;gres";
String[] strArr = myString.split(";");//разбиение по знаку ;
for (int i = 0; i < strArr.length; i++) {
System.out.print(strArr[i] + ", ");
}
System.out.println();
String resultString = hello + myString;//конкатенация
System.out.println(resultString);
}
}
Результат работы:
l
1
-1
lo
true
hello world
HELLO WORLD
Hello mir
H, e, l, l, o, , w, o, r, l, d,
I, And, Big, Java, Post, gres,
Hello worldI;And;Big;Java;Post;gres
В классе String есть еще много других методов, которые Вы обязательно посмотрите, когда будете работать с ними.
Классы StringBuilder и StringBuffer
Давайте теперь разберемся со StringBuilder и StringBuffer классами. По сути дела, это почти одинаковые классы. Единственное различие между ними: StringBuffer работает медленнее, но он потокобезопасный. Его использование целесообразно при написании программ на многопоточность.
Если Вы посмотрите на код выше, то последний метод, который я написал была конкатенация строк. То есть простое объединение строк в одну. Когда Вы работаете с классом String, результатом такой операции будет новый объект. Если программа конкатенирует много строк это может существенно потребить ресурсы памяти. В отличие от String классы StringBuilder, StringBuffer конкатенируют строки не создавая новый объект. У них есть метод append().
Все остальные методы которые есть у класса String есть у данных классов.
Теперь Вы знаете больше о строках в Java. Предлагаю закрепить наши знания и написать небольшую программу для проверки логина и пароля. Пользователь вводит логин и пароль; если пароль совпадает, то вывести в консоль приветствие.
Вот что у меня получилось:
import java.util.Scanner;
public class StringVariables {
private final static String PASSWORD = "pass43_4L";
private final static String LOGIN = "user";
public static void main(String[] args) {
System.out.println("Введите логин");
Scanner in = new Scanner(System.in);
String login = in.nextLine();
System.out.println("Введите пароль");
String password = in.nextLine();
if (LOGIN.equalsIgnoreCase(login)){
if (PASSWORD.equals(password)){
System.out.println("Приветствую " + login);
}
else {
System.out.println("Неверный пароль");
}
}
else
System.out.println("Неверный логин");
}
}