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

}
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: