Java String

Java String – один из самых широко используемых классов. Класс Java String определен в пакете java.lang.

Java String

  • По сути, строка – это последовательность символов, но это не примитивный тип.
  • Когда мы создаем строку в Java, фактически создается объект типа String.
  • String – неизменный объект, что означает, что его нельзя изменить после создания.
  • String – единственный класс, в котором поддерживается перегрузка операторов в Java. Мы можем объединять две строки, используя оператор +. Например, "a" + "b" = "ab".
  • Java предоставляет два полезных класса для манипуляции строками – StringBuffer и StringBuilder.

Давайте перейдем к изучению класса Java String.

Различные способы создания строки

Существует много способов создания объекта строки в Java, некоторые из популярных приведены ниже.

  1. Использование строкового литерала

    Это самый распространенный способ создания строки. В этом случае строковый литерал заключен в двойные кавычки.

    String str = "abc"; 
    

    Когда мы создаем строку с использованием двойных кавычек, JVM ищет в пуле строк, есть ли уже сохраненная строка с таким же значением. Если найдено, он просто возвращает ссылку на этот объект String, в противном случае создает новый объект String с заданным значением и сохраняет его в пуле строк.

  2. Использование ключевого слова new

    Мы можем создать объект String с помощью оператора new, так же как и любой обычный класс Java. В классе String доступно несколько конструкторов для получения строки из массива char, массива byte, StringBuffer и StringBuilder.

    String str  =  new String("abc");
    char[] a = {'a', 'b', 'c'};
    String str2  =  new String(a);
    

Сравнение строк в Java

Класс String предоставляет методы equals() и equalsIgnoreCase() для сравнения двух строк. Эти методы сравнивают значение строки, чтобы проверить, равны ли две строки или нет. Они возвращают true, если две строки равны, и false, если нет.

package com.journaldev.string.examples;

/**
 * Java String Example
 * 
 * @author pankaj
 *
 */
public class StringEqualExample {

	public static void main(String[] args) {
		//создание двух строковых объектов
		String s1 = "abc";
		String s2 = "abc";
		String s3 = "def";
		String s4 = "ABC";
		
		System.out.println(s1.equals(s2));//true
		System.out.println(s2.equals(s3));//false
		
		System.out.println(s1.equals(s4));//false;
		System.out.println(s1.equalsIgnoreCase(s4));//true
	}

}

Результат выполнения вышеуказанной программы:

true
false
false
true

Класс String реализует интерфейс Comparable, который предоставляет методы compareTo() и compareToIgnoreCase(), и сравнивает две строки лексикографически. Обе строки преобразуются в значение Unicode для сравнения и возвращают целочисленное значение, которое может быть больше, меньше или равно нулю. Если строки равны, то возвращается ноль, иначе возвращается значение, большее или меньшее нуля.

package com.journaldev.examples;

/**
 * Java String compareTo Example
 * 
 * @author pankaj
 *
 */
public class StringCompareToExample {

	public static void main(String[] args) {
		
		String a1 = "abc";
		String a2 = "abc";
		String a3 = "def";
		String a4 = "ABC";
		
		System.out.println(a1.compareTo(a2));//0
		System.out.println(a2.compareTo(a3));//less than 0
		System.out.println(a1.compareTo(a4));//greater than 0
		System.out.println(a1.compareToIgnoreCase(a4));//0
	}

}

Вывод вышеуказанной программы:

0
-3
32
0

Подробнее об этом можно прочитать по ссылке Пример сравнения строк String compareTo.

Методы класса String в Java

Давайте рассмотрим некоторые популярные методы класса String с примером программы.

  1. split()

    Метод split() в Java String используется для разделения строки с использованием заданного выражения. Существует два варианта метода split().

    • split(String regex): Этот метод разделяет строку, используя заданное регулярное выражение, и возвращает массив строк.
    • split(String regex, int limit): Этот метод разделяет строку с использованием заданного регулярного выражения и возвращает массив строк, но элемент массива ограничен указанным лимитом. Если указанный лимит равен 2, то метод возвращает массив размером 2.
    package com.journaldev.examples;
    
    /**
     * Пример разделения строки в Java String
     * 
     * @author pankaj
     *
     */
    public class StringSplitExample {
    
    	public static void main(String[] args) {
    		
    		String s = "a/b/c/d";
    		String[] a1 = s.split("/");
    		System.out.println("разделить строку только с использованием регулярного выражения:");
    		for (String string : a1) {
    			System.out.println(string);
    		}
    		System.out.println("разделить строку с использованием регулярного выражения с ограничением:");
    		String[] a2 = s.split("/", 2);
    		for (String string : a2) {
    			System.out.println(string);
    		}
    	}
    
    }
    

    Вывод вышеуказанной программы:

    разделить строку только с использованием регулярного выражения:
    a
    b
    c
    d
    разделить строку с использованием регулярного выражения с ограничением:
    a
    b/c/d
    
  2. contains(CharSequence s)

    Методы contains() в Java String проверяют, содержит ли строка указанную последовательность символов или нет. Этот метод возвращает true, если строка содержит указанную последовательность символов, в противном случае возвращает false.

    package com.journaldev.examples;
    
    /**
     * Пример Java String contains()
     * 
     * @author pankaj
     *
     */
    public class StringContainsExample {
    
    	public static void main(String[] args) {
    		String s = "Hello World";
    		
    		System.out.println(s.contains("W"));//true
    		System.out.println(s.contains("X"));//false
    	}
    
    }
    

    Вывод вышеупомянутой программы:

    true
    false
    
  3. length()

    Метод length() строки Java возвращает длину строки.

    package com.journaldev.examples;
    
    /**
     * Длина строки Java
     * 
     * @author pankaj
     *
     */
    public class StringLengthExample {
    
    	public static void main(String[] args) {
    		
    		String s1 = "abc";
    		String s2 = "abcdef";
    		String s3 = "abcdefghi";
    		
    		System.out.println(s1.length());//3
    		System.out.println(s2.length());//6
    		System.out.println(s3.length());//9
    
    	}
    
    }
    
  4. заменить()

    Метод замены Java String используется для замены определенной части строки другой строкой. Существует четыре варианта метода replace().

    • replace(char oldChar, char newChar): Этот метод заменяет все вхождения oldChar на newChar в строке.
    • replace(CharSequence target, CharSequence replacement): Этот метод заменяет каждую литеру цели на литеру замены в строке.
    • replaceAll(String regex, String replacement): Этот метод заменяет все вхождения подстрок, соответствующих заданному regex, на заданную замену в строке.
    • replaceFirst(String regex, String replacement): Этот метод заменяет первое вхождение подстроки, соответствующей заданному regex, на заданную замену в строке.
    package com.journaldev.examples;
    
    /**
     * Замена строки в Java
     * 
     * @author pankaj
     *
     */
    public class StringReplaceExample {
    
    	public static void main(String[] args) {
    		
    		//replace(char oldChar,  char newChar)
    		String s = "Привет, мир";
    		s = s.replace('л', 'м');
    		System.out.println("После замены 'л' на 'м' :");
    		System.out.println(s);
    		
    		//replaceAll(String regex, String replacement)
    		String s1 = "Привет journaldev, Привет pankaj";
    		s1 = s1.replaceAll("Привет", "Приветствую");
    		System.out.println("После замены :");
    		System.out.println(s1);
    		
    		//replaceFirst(String regex, String replacement) 
    		String s2 = "Привет ребята, Привет мир";
    		s2 = s2.replaceFirst("Привет", "Приветствую");
    		System.out.println("После замены :");
    		System.out.println(s2);
    
    	}
    
    }
    

    Вывод программы выше:

    После замены 'л' на 'м' :
    Привет, мир
    После замены :
    Приветствую journaldev, Приветствую pankaj
    После замены :
    Приветствую ребята, Привет мир
    
  5. format()

    Метод Java Sting format() используется для форматирования строки. Существует два варианта метода java String format().

    • format(Locale l, String format, Object… args): Этот метод форматирует строку, используя указанную локаль, строковый формат и аргументы.
    • format(String format, Object… args): Этот метод форматирует строку, используя указанный строковый формат и аргументы.
    package com.journaldev.examples;
    
    import java.util.Locale;
    
    /**
     * Форматирование строки в Java
     * 
     * @author pankaj
     *
     */
    public class StringFormatExample {
    
    	public static void main(String[] args) {
    		
    		String s = "journaldev.com";
    		// %s используется для добавления строки
    		System.out.println(String.format("Это %s", s));
    		
    		//используя локаль как Locale.US
    		System.out.println(String.format(Locale.US, "%f", 3.14));
    	}
    }
    

    Вывод программы выше:

    Это journaldev.com
    3.140000
    
  6. substring()

    Этот метод возвращает часть строки на основе указанных индексов.

    package com.journaldev.examples;
    
    /**
     * Java String substring
     *
     */
    public class StringSubStringExample {
    
    	public static void main(String[] args) {
    		
    		String s = "Это journaldev.com";
    		s = s.substring(8,18);
    		System.out.println(s);
    	}
    }
    

Конкатенация строк

Конкатенация строк является очень базовой операцией в Java. Строки могут быть объединены с использованием оператора “+” или с использованием метода concat().

package com.journaldev.examples;

/**
 * Java String concatenation
 * 
 * @author pankaj
 *
 */
public class StringConcatExample {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		String s3 = s1 + s2;
		//используя оператор +
		System.out.println("Using + operator: ");
		System.out.println(s3);
		
		//используя метод concat
		System.out.println("Using concat method: ");
		System.out.println(s1.concat(s2));

	}

}

Результат выполнения вышеуказанной программы:

Using + operator: 
HelloWorld
Using concat method: 
HelloWorld

Проверьте этот пост для получения дополнительной информации о Конкатенации строк в Java.

Пул строк в Java

Управление памятью – самый важный аспект любого языка программирования. Управление памятью для строк в Java немного отличается от других классов. Чтобы сделать Java более эффективной по памяти, JVM ввела специальную область памяти для строк, называемую String Constant Pool. При создании строкового литерала проверяется, существует ли уже идентичная строка в строковом пуле. Если она там есть, то возвращается ссылка на существующую строку из строкового пула. Давайте посмотрим на пример программы ниже.

package com.journaldev.examples;

/**
 * Java String Pool Example
 * 
 */
public class StringPoolExample {

	public static void main(String[] args) {
		
		String a = "abc";
		String b = "abc";
		String c = "def";
		
		//тот же самый указатель
		if (a==b) {
			System.out.println("Both string refer to the same object");
		}
		
		//разный указатель
		if (a==c) {
			System.out.println("Both strings refer to the same object");
		}else {
			System.out.println("Both strings refer to the different object");
		}

	}

}

Результат выполнения программы выше:

Both string refer to the same object
Both strings refer to the different object

Проверьте этот пост для получения дополнительной информации о Java String Pool.

Метод intern() для строк

Когда мы создаем строку с использованием строкового литерала, она создается в строковом пуле. Но что, если мы создаем строку с использованием ключевого слова new с тем же значением, которое уже существует в строковом пуле? Можем ли мы переместить строку из кучи памяти в строковый пул? Для этого используется метод intern(), который возвращает каноническое представление объекта строки. Когда мы вызываем метод intern() для объекта строки, созданного с использованием ключевого слова new, он проверяет, существует ли уже строка с тем же значением в пуле? Если да, то возвращается ссылка на этот объект строки из пула. Если нет, то создается новая строка с тем же содержимым в пуле и возвращается ссылка.

package com.journaldev.examples;

/**
 * Java String intern
 * 
 * @author pankaj
 *
 */
public class StringInternExample {

	public static void main(String[] args) {
		
		String s1 = "pankaj";
		String s2 = "pankaj";
		String s3 = new String("pankaj");
		
		System.out.println(s1==s2);//true
		System.out.println(s2==s3);//false
		
		String s4 = s3.intern();
		System.out.println(s1==s4);//true

	}

}

Проверьте этот пост, чтобы узнать больше о методе Java String intern.

Преимущества неизменяемости строк

Некоторые из преимуществ класса неизменяемых строк:

  1. Пул строковых констант, что позволяет экономить память.
  2. Безопасность, так как они не могут быть изменены.
  3. Потокобезопасность
  4. Безопасность загрузки классов

Проверьте этот пост, чтобы узнать больше о преимуществах неизменяемости строк.

Java 8 Метод join() для строк

A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.

List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);

Вывод: Hello World 2019

Методы строк в Java 9

В релизе Java 9 в класс String добавлено два метода. Это – codePoints() и chars(). Оба эти метода возвращают объект IntStream, на котором мы можем выполнять некоторые операции. Давайте быстро рассмотрим эти методы.

String s = "abc";

s.codePoints().forEach(x -> System.out.println(x));

s.chars().forEach(x -> System.out.println(x));

Вывод:

97
98
99
97
98
99

Новые методы класса String в Java 11

В релизе Java 11 было добавлено множество новых методов в класс String.

  • isBlank() – возвращает true, если строка пуста или содержит только символы пробела, в противном случае возвращает false.
  • lines() – возвращает поток строк, извлеченных из этой строки и разделенных разделителями строк.
  • strip(), stripLeading(), stripTrailing() – для удаления начальных и конечных пробелов из строки.
  • repeat() – возвращает строку, значение которой является конкатенацией данной строки заданное количество раз.

Давайте рассмотрим пример программы для этих методов.

package com.journaldev.strings;

import java.util.List;
import java.util.stream.Collectors;

/**
 * JDK 11 New Functions in String class
 * 
 * @author pankaj
 *
 */
public class JDK11StringFunctions {

	public static void main(String[] args) {
		// isBlank()
		String s = "abc";
		System.out.println(s.isBlank());
		s = "";
		System.out.println(s.isBlank());

		// lines()
		String s1 = "Hi\nHello\rHowdy";
		System.out.println(s1);
		List lines = s1.lines().collect(Collectors.toList());
		System.out.println(lines);

		// strip(), stripLeading(), stripTrailing()
		String s2 = "  Java,  \tPython\t ";
		System.out.println("#" + s2 + "#");
		System.out.println("#" + s2.strip() + "#");
		System.out.println("#" + s2.stripLeading() + "#");
		System.out.println("#" + s2.stripTrailing() + "#");

		// repeat()
		String s3 = "Hello\n";
		System.out.println(s3.repeat(3));
		s3 = "Co";
		System.out.println(s3.repeat(2));

	}

}

Вывод:

false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
#  Java,  	Python	 #
#Java,  	Python#
#Java,  	Python	 #
#  Java,  	Python#
Hello
Hello
Hello

CoCo

Это все, что касается класса String в Java, его методов и примеров манипуляции строками.

Вы можете проверить больше примеров строк в нашем репозитории GitHub.

Ссылка: Документация по API

Source:
https://www.digitalocean.com/community/tutorials/java-string