Класс String

  1. Создание строк и длина строки
  2. Сравнение строк
  3. Сравнение подстрок
  4. Метод compareTo()
  5. Извлечение символов - метод charAt()
  6. Поиск подстроки или символа в строке в Java
  7. Методы concat(), replace(), toLowerCase(), toUpperCase(), trim()
  8. Преобразование данных с помощью valueOf()
  9. Метод substring()
  10. Соединение символьных строк
  11. Методы isEmpty(), isBlank()

1. Создание строк и длина строки

Класс String поддерживает несколько конструкторов, например:

  • String(),
  • String(String str),
  • String(byte[] asciichar),
  • String(char[] unicodechar),
  • String(StringBuffer sbuf),
  • String(StringBuilder sbuild) и др.

Для нахождения длины строки используется метод length().

Рассмотрим разные варианты создания строк:

public class StringDemo1 {
    public static void main(String[] args) {
        String str1 = new String();
        System.out.println("str1:[" + str1 + "]");

        char[] chars1 = {'а', 'b', 'с'};
        String str2 = new String(chars1);
        System.out.println("str2:" + str2);

        char[] chars2 = {'a', 'b', 'с', 'd', 'e', 'f'};
        String str3 = new String(chars2, 2, 3);
        System.out.println("str3:" + str3);

        String str4 = "abc";
        System.out.println("str4:" + str4);
        System.out.println("str4.length:" + str4.length());
        System.out.println("abc.length:" + "abc".length());

        String str5 = new String(str4);
        System.out.println("str5:" + str5);
    }
}

В следующем примере показано, как создавать строки из массива типа byte:

public class StringDemo2 {
    public static void main(String[] args) {
        byte[] bytes = {65, 66, 67, 68, 69, 70};

        String s1 = new String(bytes);
        System.out.println(s1);

        String s2 = new String(bytes, 2, 3);
        System.out.println(s2);
    }
}

2. Сравнение строк

Для сравнения строк используются методы equals() и equalsIgnoreCase(), который не учитывает регистр символов:

public class EqualsDemo {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "Hello";
        String s3 = "Good-bye";
        String s4 = "HELLO";
        System.out.println(s1 + " equals " + s2 + " -> "
                + s1.equals(s2));
        System.out.println(s1 + " equals " + s3 + " -> "
                + s1.equals(s3));
        System.out.println(s1 + " equals " + s4 + " -> "
                + s1.equals(s4));
        System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> "
                + s1.equalsIgnoreCase(s4));
    }
}

В Java существует так называемый String Pool, в котором хранятся созданные строки. При создании очередной строки, JVM сначала ищет такую строку в String Pool. Если такая строка уже есть, то она возвращается вместо создания новой. 

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

String pool фото

Следующий пример демонстрирует сравнение строк с помощью == и метода equals():

public class EqualStrings {
    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = "Java";
        String s3 = new String("Java");
        String s4 = new String(s1);
        System.out.println("s1==s2 : " + (s1 == s2));
        System.out.println("s3==s4 : " + (s3 == s4));
        System.out.println("s1==s3 : " + (s1 == s3));
        System.out.println("s1 equals s2 : " + s1.equals(s2));
        System.out.println("s1 equals s3 : " + s1.equals(s3));
    }
}

3. Сравнение подстрок

В классе String реализована группа методов, сравнивающих часть строки с подстрокой:

  • Метод regionMatches() используется для сравнения подстроки в исходной строке с подстрокой в строке-параметре.
  • Метод startsWith() проверяет, начинается ли данная подстрока фрагментом, переданным методу в качестве параметра.
  • Метод endsWith() проверяет совпадает ли с параметром конец строки.
  • Метод contains() проверяет входит ли подстрока в строку.

Рассмотрим пример:

public class StringDemo5 {
    public static void main(String[] args) {
        System.out.println("Foobar".endsWith("bar"));
        System.out.println("Foobar".startsWith("Foo"));
        System.out.println("Foobar".contains("oo"));
        System.out.println("Hello world!!!".regionMatches(6, "world", 0, 3));
    }
}

4. Метод compareTo()

Зачастую бывает недостаточно просто знать, являются ли две строки идентичными. Для приложений, в которых требуется сортировка, нужно знать, какая из двух строк меньше другой. Для ответа на этот вопрос нужно воспользоваться методом compareTo(str) класса String.

Если результат метода меньше нуля - вызывающая строка меньше str. Больше нуля - вызывающая строка больше str. Ноль - две строки эквивалентны.

Следующий пример показывает сортировку строкового массива с помощью пузырька:

public class SortString {
    private static String[] array = {
            "Для", "работы", "со", "строками", "в", "языке", "Java",
            "используются", "классы", "String", "StringBuilder", "StringBuffer"
    };

    public static void main(String[] args) {
        for (int j = 0; j < array.length; j++) {
            for (int i = j + 1; i < array.length; i++) {
                if (array[i].compareTo(array[j]) < 0) {
                    String t = array[j];
                    array[j] = array[i];
                    array[i] = t;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }
}

5. Извлечение символов – метод charAt()

Извлечение символов осуществляется с помощью метода charAt() класса String:

public class StringDemo3 {
    public static void main(String[] args) {
        char ch = "аbс".charAt(1);
        System.out.println(ch);
    }
}

6. Поиск подстроки или символа в строке в Java

В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода — indexOf() и lastIndexOf().

indexOf() - ищет первое вхождение символа или подстроки.

lastlndexOf() - ищет последнее вхождение символа или подстроки.

Каждый из этих методов возвращает индекс того символа, который вы хотели найти, либо индекс начала искомой подстроки. В любом случае, если поиск оказался неудачным методы возвращают значение -1.

Чтобы найти первое или последнее вхождение символа, применяйте:  

int indexOf(char ch) 
int lastlndexOf(char ch) 

Здесь ch символ, который нужно искать. Чтобы найти первое или последнее вхождение подстроки, применяйте:

int indexOf(String str) 
int lastlndexOf(String str)

Вы можете указать начальную позицию для поиска, воспользовавшись следующими формами:

int indexOf(int ch, int startIndex) 
int lastlndexOf(int ch, int startIndex) 
int indexOf(String str, int startIndex) 
int lastlndexOf(String str, int startIndex)

Рассмотрим применение этих методов на следующем примере:

public class IndexOfDemo {
    public static void main(String[] args) {
        String s = "Для работы со строками в языке Java используются "
                + "классы String, StringBuilder, StringBuffer.";

        System.out.println(s);
        System.out.println("indexOf(S) = "
                + s.indexOf('S'));
        System.out.println("lastIndexOf(r) = "
                + s.lastIndexOf('r'));
        System.out.println("indexOf(String) = "
                + s.indexOf("String"));
        System.out.println("lastIndexOf(String) = "
                + s.lastIndexOf("String"));
        System.out.println("indexOf(S, 60) = "
                + s.indexOf('S', 60));
        System.out.println("lastIndexOf(S, 70) = "
                + s.lastIndexOf('S', 70));
    }
}

7. Методы concat(), replace(), toLowerCase(), toUpperCase(), trim()

Метод concat() используется для объединения двух строк.

Метод replace() заменяет один символ на другой.

Методы toLowerCase() и toUpperCase() приводят строку к верхнему или нижнему регистру.

public class ModifyStringDemo {
    public static void main(String[] args) {
        System.out.println("Hello".concat(" World"));
        System.out.println("Hello".replace('l', 'w'));
        System.out.println("Hello".toLowerCase());
        System.out.println("Hello".toUpperCase());
        System.out.println("    Hello World ".trim());
    }
}

8. Преобразование данных с помощью valueOf()

Если Вы имеете дело с каким-либо типом данных и хотите вывести значение этого типа в удобочитаемом виде, сначала придется преобразовать это значение в текстовую строку. Для этого существует метод valueOf().

Такой статический метод определен для любого существующего в Java типа данных. Благодаря этому не составляет труда преобразовать в строку значение любого типа.

static String valueOf(double num) 
static String valueOf(long num) 
static String valueOf(Object оb) 
static String valueOf(char[] chars)

9. Метод substring()

Метод substring() вырезает подстроку из строки, используя указанные позиции. Существует два варианта этого метода. Первый вариант вырезает от указанной позиции и до конца. Второй - от первой позиции до второй. Символ, находящийся в первой позиции, будет включен в результирующую строку. А последний - нет.

public class SubstringDemo {
    public static void main(String[] args) {
        System.out.println("Welcome to Kharkiv!!!".substring(10));
        System.out.println("Welcome to Kharkiv!!!".substring(10, 18));
    }
}

10. Соединение символьных строк

В версию JDK 8 в класс String был внедрен новый метод join(), предназначенный для соединения двух и более символьных строк, разграничиваемых указанным разделителем, например, пробелом или запятой:

public class StringJoinDemo {
    public static void main(String[] args) {
        String result = String.join(":", "foobar", "foo", "bar");
        System.out.println(result);
    }
}

11. Методы isEmpty(), isBlank()

Метод isEmpty() проверяет пустая ли строка. Возвращает true, только если длина строки равна 0.

Метод isBlank() возвращает true, если строка пуста или содержит только пробелы (Java 11).

public class StringEmpty {
    public static void main(String[] args) {
        System.out.println("".isEmpty());
        System.out.println(" ".isEmpty());
        System.out.println(" ".isBlank());
    }
}
Read also:
Comments