freeCodeCamp/guide/russian/java/strings/index.md

145 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Strings
localeTitle: Строки
---
# Строки
Строки - это последовательности символов. В Java `String` наследует класс `Object` . Строки не следует путать с типом данных `char` так как `char` это лишь один символ, а не последовательность символов. Вы все равно можете использовать String для хранения одного символа, однако в таком случае предпочтительнее использовать `char`.
```java
String course = "FCC";
System.out.println(course instanceof Object);
```
Вывод:
```
true
```
Вы можете создать объект String следующими способами:
1. `String str = "Это строка"; //как значение строки`
2. `String str = "Это " + "строка"; //как выражение константа`
3. `String str = new String("Это строка"); //как объект класса String используя конструктор`
Возможно, вы думаете: в чем разница между этими тремя?
Используя ключевое слово `new` гарантирует, что будет создан новый объект `String`, и новая ячейка памяти будет выделена в `Heap` памяти [(нажмите здесь, чтобы узнать больше)](https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html). Cтроковые литералы и постоянные выражения `String` кэшируются во время компиляции. Компилятор помещает их в пул строк `String` для предотвращения дублирования и улучшения потребления памяти. Распределение памяти для объектов дорогое, и этот прием увеличивает производительность при создании строк. Если вы используете те же самые значения строк, JVM использует тот же объект. Использование такого конструктора, как и выше, почти всегда является худшим выбором.
В этом фрагменте кода сколько объектов String создано?
```java
String str = "Это строка";
String str2 = "Это строка";
String str3 = new String("Это строка");
```
Ответ: 2 Создаются объекты String. `str` и `str2` оба относятся к одному и тому же объекту. `str3` имеет то же самое значение, но с использованием ключевого слова`new` произойдет принудительное создание нового, отличного объекта.
Когда вы создаете строковый литерал, JVM внутренне проверяет пул строк, так называемый `String pool` , чтобы увидеть, может ли он найти аналогичный (по значению) строковый объект. Если он найдет его, он вернет ту же ссылку. В противном случае он просто продолжит работу и создаст новый объект String в пуле, чтобы такая же проверка могла быть выполнена в будущем.
Вы можете проверить это, используя быстрое сравнение объектов `==` и реализованное `equals()` .
```java
System.out.println(str == str2); // Выведет 'true'
System.out.println(str == str3); // Выведет 'false'
System.out.println(str.equals(str3)); // Выведет 'true'
```
Вот еще один пример того, как создать строку в Java с помощью разных методов:
```java
public class StringExample{
public static void main(String args[]) {
String s1 = "java"; // создание строки присвоением строкового значения
char ch[] = {'s','t','r','i','n','g','s'};
String s2 = new String(ch); // конвертация массива символов в строку
String s3 = new String("example"); // создание нового объекта строки используя слово new
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
```
#### Сравнение строк
Если вы хотите сравнить значение двух переменных String, вы не можете использовать ==. Это связано с тем, что это будет сравнивать _ссылки_ переменных а не значения, которые связаны с ними. Чтобы сравнить значения строк, вы используете метод equals().
```java
boolean equals(Object obj)
```
Он возвращает true, если два объекта равны и false в противном случае.
```java
String str = "Hello world";
String str2 = "Hello world";
System.out.println(str == str2); // Выведет false
System.out.println(str.equals(str2); // Выведет true
```
Первое сравнение ложно, потому что «==» рассматривает ссылки, и они не совпадают.
Второе сравнение верно, потому что переменные хранят одни и те же значения. В этом случае «Hello world».
У нас есть несколько встроенных методов в String. Ниже приведен пример метода String.length(), который вычисляет длину строки в символах.
```java
public class StringDemo {
public static void main(String args[]) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
System.out.println( "String Length is : " + len );
}
}
```
Это приведет к: - `String Length is : 17`
**Ответ: 2**
Создаются объекты String.
**Заметки**
1. В методах String используются индексы с нулевым значением, за исключением второго аргумента `substring()` .
2. Класс String является окончательным - его методы нельзя переопределить.
3. Когда литерал String найден JVM, он добавляется в пул строковых литералов.
4. Класс String имеет имя метода `length()` , а массивы имеют длину имени атрибута.
5. В java строковые объекты неизменяемы. Неизменяемый просто означает что созданную строку нельзя изменить. После создания строкового объекта его данные или состояние не могут быть изменены, но создается новый строковый объект.
Длина строки
«Длина» строки - это просто количество символов в ней. Итак, «hi» - длина 2, а «Hello» - длина 5. Метод length () в строке возвращает свою длину, например:
```java
String a = "Hello";
int len = a.length(); // длина равна 5
```
#### Другие методы сравнения, которые также могут использоваться в String:
1. equalsIgnoreCase(): - сравнивает строку без учета чувствительности к регистру.
```java
String a = "HELLO";
String b = "hello";
System.out.println(a.equalsIgnoreCase(b)); // It will print true
```
2. compareTo(): - сравнивает значение лексикографически и возвращает целое число.
```java
String a = "Sam";
String b = "Sam";
String c = "Ram";
System.out.println(a.compareTo(b)); // 0
System.out.prinltn(a.compareTo(c)); // 1 потому что (a > b)
System.out.println(c.compareTo(a)); // -1 потому что (c < a)
```