Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Java
/

Неизменяемость строк

Java: Неизменяемость строк

Подумаем, что выведет на экран следующий код:

var company = "hexlet";
company.toUpperCase(); // в верхний регистр
System.out.println(company); // => ?

Кажется, что ответом будет "HEXLET", но это не так. Эта программа выведет "hexlet" (проверьте на tryjshell). Почему?

Дело в том, что строки в Java неизменяемы. Не существует способа и методов, способных изменить саму строку. Любой метод строки может только вернуть новую строку.

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

Вторая причина связана с простотой кода. Когда мы не изменяем данные, а создаем новые данные на основе старых, то код проще анализировать и модифицировать. Особенно если с данными происходит много манипуляций, с этим вам еще предстоит столкнуться.

Но как же поступать, если данные нужно поменять? Для этого достаточно заменить значение переменной:

var language = "JAVA";
language = language.toLowerCase();
System.out.println(language); // => java

С другой стороны, именно в такой ситуации можно создать новую переменную с другим именем:

var language = "JAVA";
var processedLanguage = language.toLowerCase();
System.out.println(processedLanguage); // => java

Такой подход нередко предпочтительнее по соображениям читаемости. Переменные, которые постоянно меняются, сложнее анализировать. В итоге все зависит от задачи. С опытом придет понимание, какой подход лучше.

Задание

Данные, вводимые пользователями в формах, часто содержат лишние пробельные символы в конце или начале строки. Кроме того, пользователи могут вводить одно и то же в разном регистре, что потом мешает работе с данными. Поэтому перед тем как добавлять их, данные обрабатывают (говорят нормализуют). В базовую обработку входят два действия:

  • Удаление концевых пробельных символов с помощью метода .trim(), например, было: " hexlet\n ", стало: "hexlet"
  • Приведение к нижнему регистру с помощью метода toLowerCase(). Было: "SUPPORT@hexlet.io", стало: "support@hexlet.io".

Обновите переменную email записав в неё то же самое значение, но обработанное по схеме указанной выше. Распечатайте то, что получилось, на экран.

Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Java
/

Неизменяемость строк

Java: Неизменяемость строк

Подумаем, что выведет на экран следующий код:

var company = "hexlet";
company.toUpperCase(); // в верхний регистр
System.out.println(company); // => ?

Кажется, что ответом будет "HEXLET", но это не так. Эта программа выведет "hexlet" (проверьте на tryjshell). Почему?

Дело в том, что строки в Java неизменяемы. Не существует способа и методов, способных изменить саму строку. Любой метод строки может только вернуть новую строку.

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

Вторая причина связана с простотой кода. Когда мы не изменяем данные, а создаем новые данные на основе старых, то код проще анализировать и модифицировать. Особенно если с данными происходит много манипуляций, с этим вам еще предстоит столкнуться.

Но как же поступать, если данные нужно поменять? Для этого достаточно заменить значение переменной:

var language = "JAVA";
language = language.toLowerCase();
System.out.println(language); // => java

С другой стороны, именно в такой ситуации можно создать новую переменную с другим именем:

var language = "JAVA";
var processedLanguage = language.toLowerCase();
System.out.println(processedLanguage); // => java

Такой подход нередко предпочтительнее по соображениям читаемости. Переменные, которые постоянно меняются, сложнее анализировать. В итоге все зависит от задачи. С опытом придет понимание, какой подход лучше.

Задание

Данные, вводимые пользователями в формах, часто содержат лишние пробельные символы в конце или начале строки. Кроме того, пользователи могут вводить одно и то же в разном регистре, что потом мешает работе с данными. Поэтому перед тем как добавлять их, данные обрабатывают (говорят нормализуют). В базовую обработку входят два действия:

  • Удаление концевых пробельных символов с помощью метода .trim(), например, было: " hexlet\n ", стало: "hexlet"
  • Приведение к нижнему регистру с помощью метода toLowerCase(). Было: "SUPPORT@hexlet.io", стало: "support@hexlet.io".

Обновите переменную email записав в неё то же самое значение, но обработанное по схеме указанной выше. Распечатайте то, что получилось, на экран.

Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;

import static org.assertj.core.api.Assertions.assertThat;

class Test {
    public static void main(String[] args) {
        final var expected = "support@hexlet.io";

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        System.setOut(new PrintStream(out));

        App.main(null);

        final var actual = out.toString().trim();

        System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
        System.out.println(actual);

        assertThat(actual).isEqualTo(expected);
    }
}
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →