Java string: работа со строками в java

Введение в строки. Класс String

Последнее обновление: 31.10.2018

Строка представляет собой последовательность символов. Для работы со строками в Java определен класс String, который предоставляет ряд методов для манипуляции строками.
Физически объект String представляет собой ссылку на область в памяти, в которой размещены символы.

Для создания новой строки мы можем использовать один из конструкторов класса String, либо напрямую присвоить строку в двойных кавычках:

public static void main(String[] args) {
        
    String str1 = "Java";
    String str2 = new String(); // пустая строка
    String str3 = new String(new char[] {'h', 'e', 'l', 'l', 'o'});
    String str4 = new String(new char[]{'w', 'e', 'l', 'c', 'o', 'm', 'e'}, 3, 4);//3 -начальный индекс, 4 -кол-во символов
        
    System.out.println(str1); // Java
    System.out.println(str2); //
    System.out.println(str3); // hello
    System.out.println(str4); // come
}

При работе со строками важно понимать, что объект String является неизменяемым (immutable). То есть при любых операциях
над строкой, которые изменяют эту строку, фактически будет создаваться новая строка

Поскольку строка рассматривается как набор символов, то мы можем применить метод length() для нахождения длины строки или длины набора символов:

String str1 = "Java";
System.out.println(str1.length()); // 4

А с помощью метода toCharArray() можно обратно преобразовать строку в массив символов:

String str1 = new String(new char[] {'h', 'e', 'l', 'l', 'o'});
char[] helloArray = str1.toCharArray();

Строка может быть пустой. Для этого ей можно присвоить пустые кавычки или удалить из стоки все символы:

String s = "";   // строка не указывает на объект
if(s.length() == 0) System.out.println("String is empty");

В этом случае длина строки, возвращаемая методом length(), равна 0.

Класс String имеет специальный метод, который позволяет проверить строку на пустоту — isEmpty(). Если строка пуста, он возвращает true:

String s = "";   // строка не указывает на объект
if(s.isEmpty()) System.out.println("String is empty");

Переменная String может не указывать на какой-либо объект и иметь значение null:

String s = null;   // строка не указывает на объект
if(s == null) System.out.println("String is null");

Значение null не эквивалентно пустой строке. Например, в следующем случае мы столкнемся с ошибкой выполнения:

String s = null;   // строка не указывает на объект
if(s.length()==0) System.out.println("String is empty");	// ! Ошибка

Так как переменная не указывает ни на какой объект String, то соответственно мы не можем обращаться к методам объекта String.
Чтобы избежать подобных ошибок, можно предварительно проверять строку на null:

String s = null;   // строка не указывает на объект
if(s!=null && s.length()==0) System.out.println("String is empty");

Основные методы класса String

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

  • concat(): объединяет строки

  • valueOf(): преобразует объект в строковый вид

  • join(): соединяет строки с учетом разделителя

  • сompareTo(): сравнивает две строки

  • charAt(): возвращает символ строки по индексу

  • getChars(): возвращает группу символов

  • equals(): сравнивает строки с учетом регистра

  • equalsIgnoreCase(): сравнивает строки без учета регистра

  • regionMatches(): сравнивает подстроки в строках

  • indexOf(): находит индекс первого вхождения подстроки в строку

  • lastIndexOf(): находит индекс последнего вхождения подстроки в строку

  • startsWith(): определяет, начинается ли строка с подстроки

  • endsWith(): определяет, заканчивается ли строка на определенную подстроку

  • replace(): заменяет в строке одну подстроку на другую

  • trim(): удаляет начальные и конечные пробелы

  • substring(): возвращает подстроку, начиная с определенного индекса до конца или до определенного индекса

  • toLowerCase(): переводит все символы строки в нижний регистр

  • toUpperCase(): переводит все символы строки в верхний регистр

Разберем работу этих методов.

НазадВперед

All String Methods

The String class has a set of built-in methods that you can use on strings.

Method Description Return Type
charAt() Returns the character at the specified index (position) char
codePointAt() Returns the Unicode of the character at the specified index int
codePointBefore() Returns the Unicode of the character before the specified index int
codePointCount() Returns the Unicode in the specified text range of this String int
compareTo() Compares two strings lexicographically int
compareToIgnoreCase() Compares two strings lexicographically, ignoring case differences int
concat() Appends a string to the end of another string String
contains() Checks whether a string contains a sequence of characters boolean
contentEquals() Checks whether a string contains the exact same sequence of characters
of the specified CharSequence or StringBuffer
boolean
copyValueOf() Returns a String that represents the characters of the character array String
endsWith() Checks whether a string ends with the specified character(s) boolean
equals() Compares two strings. Returns true if the strings are equal, and false
if not
boolean
equalsIgnoreCase() Compares two strings, ignoring case considerations boolean
format() Returns a formatted string using the specified locale, format string, and arguments String
getBytes() Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array byte[]
getChars() Copies characters from a string to an array of chars void
hashCode() Returns the hash code of a string int
indexOf() Returns the position of the first found occurrence of specified characters in a string int
intern() Returns the canonical representation for the string object String
isEmpty() Checks whether a string is empty or not boolean
lastIndexOf() Returns the position of the last found occurrence of specified characters in a string int
length() Returns the length of a specified string int
matches() Searches a string for a match against a regular expression, and returns the matches boolean
offsetByCodePoints() Returns the index within this String that is offset from the given index by codePointOffset code points int
regionMatches() Tests if two string regions are equal boolean
replace() Searches a string for a specified value, and returns a new string where the specified values are replaced String
replaceFirst() Replaces the first occurrence of a substring that matches the given regular expression with the given replacement String
replaceAll() Replaces each substring of this string that matches the given regular expression with the given replacement String
split() Splits a string into an array of substrings String[]
startsWith() Checks whether a string starts with specified characters boolean
subSequence() Returns a new character sequence that is a subsequence of this sequence CharSequence
substring() Returns a new string which is the substring of a specified string String
toCharArray() Converts this string to a new character array char[]
toLowerCase() Converts a string to lower case letters String
toString() Returns the value of a String object String
toUpperCase() Converts a string to upper case letters String
trim() Removes whitespace from both ends of a string String
valueOf() Returns the string representation of the specified value String

❮ Previous
Next ❯

Преобразование с использованием Integer.toString(int)

Класс Integer имеет статический метод, который возвращает объект String, представляющий параметр int, указанный в функции Integer.toString(int). Этот подход, в отличие от других, может возвращать исключение NullPointerException.

Синтаксис

Есть два разных выражения для метода Integer.toString():

public static String toString(int i)

public static String toString(int i, int radix)

Параметры

Параметры этого метода:

  • i: целое число, которое будет преобразовано.
  • radix: используемая система счисления базы для представления строки.

Возвращаемое значение

Возвращаемое значение для обоих выражений – строка Java, представляющая целочисленный аргумент «i». Если используется параметр radix, возвращаемая строка определяется соответствующим основанием.

Пример

package MyPackage;
public class Method1 
{
	public static void main(String args[]) 
	{
		  int n = Integer.MAX_VALUE;
		  String str1 = Integer.toString(n);
		  System.out.println("The output string is: " + str1);
		  int m = Integer.MIN_VALUE;
		  String str2 = Integer.toString(m);
		  System.out.println("The output string is: " + str2);
	}
	 
}

Вариант 2: Возвращаемся к нашему основному вопросу

Почему нужно переопределить метод toString() для отображения содержимого ArrayList?

В приведенном выше примере:

  • Мы переопределили метод toString Java;
  • Предоставили детали реализации для вывода информации о сотрудниках в определенном формате;
  • Благодаря переопределению метода toString() можно отображать информацию о сотрудниках в желаемом формате.

Пойдем еще дальше и посмотрим, что произошло бы, если бы мы не переопределили метод toString ().

Класс Employee

  • Это тот же класс сотрудников, содержащий четыре атрибута: Id, name, age, designation;
  • Конструктор с четырьмя аргументами;
  • Но в этом случае не переопределяется метод toString(). Это означает, что по умолчанию будет вызван метод toString() класса Object.

Employee.java

package in.bench.resources.override.tostring;

public class Employee {

    // внутренние переменные
    private int employeeId;
    private String employeeName;
    private int employeeAge;
    private String employeeDesignation;

    // Конструктор с четырьмя аргументами
    public Employee(int employeeId, String employeeName, int employeeAge,
            String employeeDesignation) {
        super();
        this.employeeId = employeeId;
        this.employeeName = employeeName;
        this.employeeAge = employeeAge;
        this.employeeDesignation = employeeDesignation;
    }
}

Примечание: метод toString() не переопределяется.

Основной класс — для хранения и извлечения записей сотрудников

Это тот же самый класс, который используется в первом варианте toString Java.

StoreAndRetrieveEmployeeRecords.java

package in.bench.resources.override.tostring;

import java.util.ArrayList;

public class StoreAndRetrieveEmployeeRecords {

    public static void main(String[] args) {

        // создаем объект ArrayList object для хранения записей сотрудников
        ArrayList<Employee> empRecords = new ArrayList<Employee>();

        // добавляем записи сотрудников в объект AL
        empRecords.add(new Employee(101, "SJ", 19, "Writer"));
        empRecords.add(new Employee(102, "RS", 17, "Developer"));
        empRecords.add(new Employee(103, "ZR", 25, "Supporter"));
        empRecords.add(new Employee(104, "IL", 27, "Manager"));
        empRecords.add(new Employee(105, "SR", 15, "Marketer"));

        // извлекаем записи сотрудников с помощью улучшенного цикла forEach
        for(Employee emp : empRecords) {
            System.out.println(emp);
        }
    }
}

Результат

in.bench.resources.override.tostring.Employee@1db9742
in.bench.resources.override.tostring.Employee@106d69c
in.bench.resources.override.tostring.Employee@52e922
in.bench.resources.override.tostring.Employee@25154f
in.bench.resources.override.tostring.Employee@10dea4e

Присоединение, объединение или добавление строк в Java

Самый простой способ объединить строки в Java — это использовать +. Это работает так:

String text1 = "Hello";

String text2 = "Jim";

System.out.println(text1 + " " + text2);

Однако это не очень эффективно, потому что каждый раз, когда вы пишете +, вы создаете новый объект String. По этой причине вы можете использовать StringBuilder или более старую поточно-ориентированную версию StringBuffer.

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" to");
sb.append(" you");
System.out.println(sb.toString());

Более того, поскольку append() возвращает ссылку на сам объект StringBuilder, мы можем написать что-то вроде этого с тем же эффектом:

StringBuilder sb = new StringBuilder();
sb.append("Hello")
.append(" to")
.append(" you");
System.out.println(sb.toString());

Подстрока Java: выбор частей строк

Чтобы получить часть строки, используйте метод substring.

String substring(int beginIndex, int endIndex)

Длина выбранной подстроки равна endIndex — startIndex.

Вот несколько примеров.

String text = "The quick brown fox";
// Everything from index 4 onwards
System.out.println(text.substring(4));
// Index 0 up to but not including index 3.
System.out.println(text.substring(0, 3));

Java Array String: объединение массивов строк

Удивительно, но в ядре Java нет способа объединения массивов строк, хотя такие методы существуют в различных библиотеках.

Вы всегда можете создать свои собственные. Следующий класс объявляет именно такой метод и использует его для соединения массива строк. Вы можете легко адаптировать это для работы с ArrayList или Vector или чем-то еще.

package caveofprogramming.aquarium;
package caveofprogramming.aquarium;

import java.util.*;

public class Test {
    public static String join(String[] strings, String glue) {
    
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i < strings.length; i++) {
            sb.append(strings);
            
            if(i < strings.length - 1) {
                sb.append(glue);
            }
        }
        
        return sb.toString();
    }
    
    public static void main(String [] args) {

        String texts[] = {"Hello", "to", "you"};
        System.out.println(join(texts, " "));
    }
}

Java String Split: разделение строк

Вы можете разбить строку на массив токенов, используя метод split (REGEX).

Давайте посмотрим на некоторые примеры.

Чтобы разделить пробелом (это также работает для вкладок):

String text = "The quick brown fox";
String text = "The quick brown fox";
        
// Split on whitespace
String [] tokens = text.split("\s+");
        
for(int i=0; i < tokens.length; i++) {
    System.out.println(tokens);
}

Разделим электронный адрес на части

String text = "someone@nowhere.com";

// Split on @ and .
// The double backslashes make this regular
// expression look more confusing than it is.
// We are escaping once for the sake of the
// regex, and again for the sake of Java.
String [] tokens = text.split("+");

for(int i=0; i < tokens.length; i++) {
    System.out.println(tokens);
}

Извлекаем символы и подстроки в Java

Чтобы извлечь символы по индексу, в классе String есть метод char charAt(int index). Этот метод принимает индекс, по которому необходимо получить символы, возвращая извлеченный символ:

String str = "Java";
char c = str.charAt(2);
System.out.println(c); // v

Обратите внимание, что индексация начинается с нуля, впрочем, как и в массивах. Если же нужно извлечь сразу группу символов либо подстроку, подойдёт getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

Этот метод принимает ряд параметров:
• srcBegin: индекс в нашей строке, с которого осуществляется начало извлечения символов;
• srcEnd: индекс в нашей строке, до которого осуществляется извлечение символов;
• dst: массив символов (именно в него будут эти символы извлекаться);
• dstBegin: индекс в массиве dst (с него надо добавлять символы, извлечённые из строки).

String str = "Hi world!";
int start = 6;
int end = 11;
char[] dst=new charend - start];
str.getChars(start, end, dst, );
System.out.println(dst); // world

Конвертация с помощью String.format()

String.format() – это новый альтернативный метод, который можно использовать для преобразования Integer в объект String. Хотя целью этого метода является форматирование строки, его также можно использовать для преобразования.

Синтаксис

Есть два разных выражения:

public static String format(Locale l, String format, Object… args)

public static String format(String format, Object… args)

Параметры

Аргументы для этого метода:

  • l: локальный адрес для форматирования;
  • format: строка формата, которая включает спецификатор формата и иногда фиксированный текст;
  • args: аргументы, которые ссылаются на спецификаторы формата, установленные в параметре format.

Возвращаемое значение

Этот метод возвращает отформатированную строку в соответствии со спецификатором формата и указанными аргументами.

Пример

class Method3
{ 
  public static void main(String args[]) 
  { 
    int number = -1234; 
    String str = String.format("%d", number);
    System.out.println("With format method: string = " + str);
  } 
}

Методы String

Метод Описание
charAt() Возвращает символ строки с указанным индексом (позицией).
charCodeAt() Возвращает числовое значение Unicode символа, индекс которого был передан методу в качестве аргумента.
concat() Возвращает строку, содержащую результат объединения двух и более предоставленных строк.
fromCharCode() Возвращает строку, созданную с помощью указанной последовательности значений символов Unicode.
indexOf() Возвращает позицию первого символа первого вхождения указанной подстроки в строке.
lastIndexOf() Возвращает позицию последнего найденного вхождения подстроки или -1, если подстрока не найдена.
localeCompare() Возвращает значение, указывающее, эквивалентны ли две строки в текущем языковом стандарте.
match() Ищет строку, используя предоставленный шаблон регулярного выражения, и возвращает результат в виде массива. Если совпадений не найдено, метод возвращает значение null.
replace() Ищет строку для указанного значения или регулярного выражения и возвращает новую строку, где указанные значения будут заменены. Метод не изменяет строку, для которой он вызывается.
search() Возвращает позицию первого соответствия указанной подстроки или регулярного выражения в строке.
slice() Позволяет извлечь подстроку из строки. Первый аргумент указывает индекс с которого нужно начать извлечение. Второй необязательный аргумент указывает позицию, на которой должно остановиться извлечение. Если второй аргумент не указан, то извлечено будет все с той позиции, которую указывает первый аргумент, и до конца строки.
split() Разбивает строку на подстроки, возвращая массив подстрок. В качестве аргумента можно передать символ разделитель (например запятую), используемый для разбора строки на подстроки.
substr() Позволяет извлечь подстроку из строки. Первый аргумент указывает индекс с которого нужно начать извлечение. Второй аргумент указывает количество символов, которое нужно извлечь.
substring() Извлекает символы из строки между двух указанных индексов, если указан только один аргумент, то извлекаются символы от первого индекса и до конца строки.
toLocaleLowerCase() Преобразует символы строки в нижний регистр с учетом текущего языкового стандарта.
toLocaleUpperCase() Преобразует символы строки в верхний регистр с учетом текущего языкового стандарта.
toLowerCase() Конвертирует все символы строки в нижний регистр и возвращает измененную строку.
toString() Возвращает строковое представление объекта.
toUpperCase() Конвертирует все символы строки в верхний регистр и возвращает измененную строку.
trim() Удаляет пробелы в начале и конце строки и возвращает измененную строку.
valueOf() Возвращает примитивное значение объекта.

Creating strings using the new keyword

So far we have created strings like primitive types in Java.

Since strings in Java are objects, we can create strings using the keyword as well. For example,

In the above example, we have created a string name using the keyword.

Here, when we create a string object, the constructor is invoked. To learn more about constructor, visit Java Constructor.

Note: The class provides various other constructors to create strings. To learn more, visit Java String (official Java documentation).

Create String using literals vs new keyword

Now that we know how strings are created using string literals and the keyword, let’s see what is the major difference between them.

In Java, the JVM maintains a string pool to store all of its strings inside the memory. The string pool helps in reusing the strings.

1. While creating strings using string literals,

Here, we are directly providing the value of the string (). Hence, the compiler first checks the string pool to see if the string already exists.

  • If the string already exists, the new string is not created. Instead, the new reference, example points to the already existed string ().
  • If the string doesn’t exist, the new string ( is created.

2. While creating strings using the new keyword,

Here, the value of the string is not directly provided. Hence, a new string is created even though is already present inside the memory pool.

Типы формата строки Java

Мы можем использовать следующие типы строкового формата для преобразования в строка

Тип формата Тип данных Результат
%a Плавающая запятая Шестнадцатеричное значение числа с плавающей запятой
%b Любой тип «Истина», если не ноль, и «Ложь», если ноль
%c Характер Unicode персонаж
%d Целое Десятичное целое число
%e Плавающая запятая Десятичное число в экспоненциальном представлении
%f Плавающая запятая Десятичное число
%g Плавающая запятая Десятичное число в экспоненциальном представлении, основанное на точности и значении
%h Любой тип Значение шестнадцатеричной строки из метода hashCode ()
%n все Разделитель строк для конкретной платформы
%o Целое Восьмеричное число
%s Любой тип строка
%t Дата / время Это префикс для преобразования даты / времени. См. Более подробную информацию в таблице ниже.
%x Целое Шестигранная строка

Примеры формата строки Java

public class Democlass {

  public static void main(String[] args) {
    formatString();
    
  }
  
  public static void formatString()
  {
    System.out.println("Output of %a is " + String.format("%a", 1.5));
    System.out.println("Output of %b is " + String.format("%b", false));
    System.out.println("Output of %B is " + String.format("%B", true));
    System.out.println("Output of %c is " + String.format("%c", 'd'));
    System.out.println("Output of %d is " + String.format("%d", 101));
    System.out.println("Output of %e is " + String.format("%e", 5.6));
    System.out.println("Output of %f is " + String.format("%f", 5.6));
    System.out.println("Output of %g is " + String.format("%g", 5.6));
    System.out.println("Output of %h is " + String.format("%h", 10));
    System.out.println("Output of %n is " + String.format("%n"));
    System.out.println("Output of %o is " + String.format("%o", 8));
    System.out.println("Output of %s is " + String.format("%s", "Java"));
    System.out.println("Output of %x is " + String.format("%x", 10));
  }
}


Output:
Output of %a is 0x1.8p0
Output of %b is false
Output of %B is TRUE
Output of %c is d
Output of %d is 101
Output of %e is 5.600000e+00
Output of %f is 5.600000
Output of %g is 5.60000
Output of %h is a
Output of %n is 

Output of %o is 10
Output of %s is Java
Output of %x is a

substring(int beginIndex, int endIndex)

Этот метод вернет новый объект String, содержащий подстроку данной строки от указанного startIndex до endIndex. И получит часть String, начиная с данного beginIndex и до указанного endIndex.

public String substring(int beginIndex, int endIndex)

где beginIndex — индекс, с которого нужно начать извлечение возвращаемой подстроки. (включительно) endIndex — индекс, с которого нужно закончить извлечение возвращаемой подстроки. (эксклюзив)

Смысл в том, что мы можем указать, где начинать и заканчивать копирование символов из исходной строки.

public class SubstringTest {  
   public static void main(String[] args) {
      String testString = "ABCDEFGHIJ";
      System.out.println(testString.substring(0,5));
      System.out.println(testString.substring(1,5));
      System.out.println(testString.substring(2,5));
      System.out.println(testString.substring(0,6));
      System.out.println(testString.substring(1,6));
      System.out.println(testString.substring(2,6));
      System.out.println(testString.substring(0,7));
      System.out.println(testString.substring(1,7));
      System.out.println(testString.substring(2,7));
   }
}

Вывод

ABCDE
BCDE
CDE
ABCDEF
BCDEF
CDEF
ABCDEFG
BCDEFG
CDEFG

Вот пример программы, которая примет строку и распечатает все возможные подстроки.

import java.util.Scanner;
public class PrintAllSubstring {  
   public static void main(String[] args) {
      System.out.println("Enter a string:");
      Scanner in = new Scanner(System.in);
      String inputString = in.nextLine();
      for (int beginIndex = 0; beginIndex < inputString.length(); beginIndex++) {
         for (int endIndex = beginIndex + 1; endIndex <= inputString.length(); endIndex++) {
            System.out.println(inputString.substring(beginIndex, endIndex));
         }
      }
   }
}

И вот результат, предполагающий, что была введена строка wxyz.

Enter a string:
wxyz
w
wx
wxy
wxyz
x
xy
xyz
y
yz
z

Вот пример того, как получить середину строки с помощью метода substring в алгоритме.

public class MiddleStrTest {
   public static void main(String[] args) {
      System.out.println("A       --> " + getMiddleString("A"));
      System.out.println("AB      --> " + getMiddleString("AB"));
      System.out.println("ABC     --> " + getMiddleString("ABC"));
      System.out.println("ABCD    --> " + getMiddleString("ABCD"));
      System.out.println("ABCDE   --> " + getMiddleString("ABCDE"));
      System.out.println("ABCDEF  --> " + getMiddleString("ABCDEF"));
      System.out.println("ABCDEFG --> " + getMiddleString("ABCDEFG"));
   }
   private static String getMiddleString(String str) {
      if (str.length() <= 2) {
         return str;
      }
      int beginIndex = (str.length() - 1) / 2;
      int endIndex = beginIndex + 2 - (str.length() % 2);
      return str.substring(beginIndex, endIndex);
   }
}

Вывод

A       --> A
AB      --> AB
ABC     --> B
ABCD    --> BC
ABCDE   --> C
ABCDEF  --> CD
ABCDEFG --> D

Вот пример программы, которая перевернет строку.

public class ReverseTest {
   public static void main(String[] args) {
      System.out.println(reverse("ABCDEFG"));
   }
   private static String reverse(String str) {
      if (str.length() <= 1) {
         return str;
      }
      return reverse(str.substring(1)) + str.substring(0, 1);
   }
}

Это выведет обратную строку ABCDEFG: Вот пример программы, которая проверит, является ли строка палиндромом или нет.

public class PalTest {
   public static void main(String[] args) {
      System.out.println(palindrome("ABCBA"));
      System.out.println(palindrome("ABCCBA"));
      System.out.println(palindrome("ABCCXA"));
      System.out.println(palindrome("ABCDEFG"));
   }
   private static boolean palindrome(String str) {
      if (str.length() <= 1) {
         return true;
      }
      String first = str.substring(0, 1);
      String last = str.substring(str.length() - 1);
      return first.equals(last)
            && palindrome(str.substring(1, str.length() - 1));
   }
}

Вывод

true
true
false
false

Оцени статью

Оценить

Средняя оценка / 5. Количество голосов:

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Спасибо за ваши отзыв!

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector