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

Строки в Java: String, StringBuilder, StringBuffer

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

  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) – разбивает строку по заданному символу.
Код   
package com.string;

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().

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

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

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

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

Код   
package com.string;

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("Неверный логин");
    }
   

}

Leave a Comment

Your email address will not be published.