кот пишет письмо

Работа со строками в Java: String, StringBuilder, StringBuffer

Настало время поговорить о работе со строками. Это та самая работа со String, которую я обещал показать в одной из первых статей. В языке Java нет примитивных типов для работы со строками, но есть несколько объектов, которые предназначенные для этого: String, StringBuilder, StringBuffer.

На практике Вы будете больше работать и встречать объект 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 в этом плане имеет множество полезных методов; наиболее полезные и часто используемые мы сейчас разберем.

  1. lengtn() — возвращает длину строки;
  2. charAt(int number) — возвращает символ по указанному индексу. Отсчет идет с 0;
  3. indexOf(char sumbol) — возвращает индекс по указанному символу. Если символа не найдено возвращается -1;
  4. substring(int startIndex) — возвращает подстроку строки начиная с указанного индекса;
  5. substring(int startIndex, int endIndex) — возвращает подстроку строки начиная с указанного индекса и заканчивая указанным индексом;
  6. startsWith(String sumbolOrSumbols) — возвращает true если строка начинается с указанного слова или символа;
  7. toLowerCase() — переводит строку в нижний регистр;
  8. toUpperCase() — переводит строку в верхний регистр;
  9. replaceAll(String partWhichReplace, String partOnWhichReplace) — заменяет часть строки на заменяемую строку
  10. equals(String strToCompare) — сравнение строк. Данный метод используется для сравнения объектов не по ссылке, а по содержанию;
  11. equalsIgnoreCase(String strToCompare) — сравнение без учета регистра;
  12. trim() — убирает пробелы в конце и в начале строки (если есть);
  13. toCharArray() — разбивает строку на массив char;
  14. split(String reqexp) — разбивает строку по заданному символу.
Код    
  1. package com.string;
  2.  
  3. public class StringVariables {
  4.    
  5.      
  6.  
  7.     public static void main(String[] args) {
  8.         String hello = "Hello world";
  9.          System.out.println(hello.length());
  10.          System.out.println(hello.charAt(2));//отсчет с 0
  11.          System.out.println(hello.indexOf("e"));
  12.          System.out.println(hello.indexOf("y"));//-1 так как символа не найдено
  13.          System.out.println(hello.substring(3, 6));
  14.          System.out.println(hello.startsWith("He"));
  15.          System.out.println(hello.toLowerCase());
  16.          System.out.println(hello.toUpperCase());
  17.          System.out.println(hello.replaceAll("world", "mir"));
  18.          
  19.          String[] stringArray = hello.split("");//разбиение на символы
  20.          //по сути метод стал похож на toCharArray
  21.          for (int i = 0; i < stringArray.length; i++) {
  22.             System.out.print(stringArray[i] + ", ");
  23.         }
  24.          System.out.println();
  25.          String myString = "I;And;Big;Java;Post;gres";
  26.          String[] strArr = myString.split(";");//разбиение по знаку ;
  27.          for (int i = 0; i < strArr.length; i++) {
  28.             System.out.print(strArr[i] + ", ");
  29.         }
  30.          System.out.println();
  31.          String resultString = hello + myString;//конкатенация
  32.          System.out.println(resultString);
  33.     }
  34.    
  35.  
  36. }

Результат работы:

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 классами. По сути дела, это почти одинаковые классы. Единственное различие между ними: StringBuffer работает медленнее, но он потокобезопасный.  Его использование целесообразно при написании программ на многопоточность.

Если Вы посмотрите на код выше, то последний метод, который я написал была конкатенация строк. То есть простое объединение строк в одну. Когда Вы работаете с классом String, результатом такой операции будет новый объект. Если программа конкатенирует много строк это может существенно потребить ресурсы памяти. В отличие от String классы StringBuilder, StringBuffer конкатенируют строки не создавая новый объект. У них есть метод append().

Код    
  1. StringBuilder string = new StringBuilder("Hello world");
  2.         String str = "!!!";
  3.         System.out.println(string.append(str));//Hello world!!!

Все остальные методы которые есть у класса String есть у данных классов.

Теперь Вы знаете, как пользоваться строковыми переменными в Java. Предлагаю закрепить наши знания и написать небольшую программу для проверки логина и пароля. Пользователь вводит логин и пароль; если пароль совпадает, то вывести в консоль приветствие.

Вот что у меня получилось:

Код    
  1. package com.string;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class StringVariables {
  6.    
  7.     private final static String PASSWORD = "pass43_4L";
  8.     private final static String LOGIN = "user";
  9.  
  10.     public static void main(String[] args) {
  11.         System.out.println("Введите логин");
  12.         Scanner in = new Scanner(System.in);
  13.         String login = in.nextLine();
  14.         System.out.println("Введите пароль");
  15.         String password = in.nextLine();
  16.        
  17.         if (LOGIN.equalsIgnoreCase(login)){
  18.             if (PASSWORD.equals(password)){
  19.                 System.out.println("Приветствую " + login);
  20.             }
  21.             else {
  22.                 System.out.println("Неверный пароль");
  23.             }
  24.         }
  25.         else
  26.             System.out.println("Неверный логин");
  27.     }
  28.    
  29.  
  30. }

Добавить комментарий