Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/119: Рейтинг темы: голосов - 119, средняя оценка - 4.98
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294

Сравнение строк (String) в java. Мини гайд для начинающих

27.08.2018, 18:08. Показов 23355. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет!

Одна из самых распространенных ошибок начинающих, выражаемая в очень частых темах типа – «не работает условие…», является ошибка сравнения строк (String).

Попробую максимально просто объяснить, что с ними не так.

Во-первых. Строка – это объект. Именно объект, а не примитив (такой как int, например).
Поэтому, даже если две строки содержат одинаковый набор символов, они представляют собой два разных объекта! Соответственно «==» будет давать false, объекты-то не одни и те же!

Но иногда такое сравнение работает. Почему? Попробуем разобраться.
Java
1
2
3
String s1 = “hello”;
String s2 = “hello”;
System.out.println(s1 == s2);   //true
При таком создании строк (через литералы), данный набор символов помещается в так называемый пул строк, и переменным присваивается ссылка на этот набор. Т.е. ссылки будут одинаковые и == даст true. (Это справедливо, если значения переменных известны на этапе компиляции).

Но если мы сделаем, например, так:
Java
1
2
3
String s1 = “hello”;
String s2 = new String (“hello”);
System.out.println(s1 == s2);   //false
Т.к. будет принудительно создан новый объект, переменные будут иметь разные ссылки. При присвоении стринговым переменным значений, неизвестных на момент компиляции (например в цикле перебора чего-либо) приводит именно к такой ситуации - созданию нового объекта.


Вывод: если не хотите заморачиваться, для сравнения строк нужно использовать метод equals(), он посимвольно сравнивает строки и дает true при полном совпадении:
Java
1
2
3
String s1 = “hello”;
String s2 = new String (“hello”);
System.out.println(s1.equals(s2));  // true
Разница в этих подходах в быстродействии (== работает ессно, быстрей), но в большинстве случаев, особенно у начинающих это абсолютно не критично.

Надеюсь, объяснил понятно. Всем добра!
20
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2018, 18:08
Ответы с готовыми решениями:

сравнение строк (string)
код #include <iostream> int main (){ std::string my_str; while (my_str != "y" || my_str != "Y"){ std::cout<<"Enter you...

String сравнение строк
Я знаю что строки так сравнивать нельзя. Но как же мне поступить? Суть идеи написана в коде.... (Угадайте слово по буквам) ...

Сравнение строк с типом string
Приветствую уважаемые посетители сей темы! Хотелось бы узнать как можно сравнить переменную типа string? (Возможно есть какой то прототип...

5
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
27.08.2018, 18:10
Добавлю свои 2 цента:
Пул строк потребляет больше памяти, нежели хранение строк по id в каком нибудь массиве.
Примерно на 15 Мб, каждые 100,000 ссылок.
4
 Аватар для Aviz__
2740 / 2049 / 507
Регистрация: 17.02.2014
Сообщений: 9,470
06.09.2018, 12:03
Иногда строку, допустим полученную с клавиатуры inputUser, нужно сравнивать со строковым литералом, скажем "Yes".
Это лучше сделать так:
Java
1
"Yes".equals(inputUser)
2
06.09.2018, 12:33

Не по теме:

Цитата Сообщение от Aviz__ Посмотреть сообщение
Это лучше сделать так:
ты главное не объясняй почему) новичкам же не интересно

0
 Аватар для Aviz__
2740 / 2049 / 507
Регистрация: 17.02.2014
Сообщений: 9,470
06.09.2018, 12:39
Цитата Сообщение от Welemir1 Посмотреть сообщение
не объясняй почему
Договорились, про возможный inputUser = null, можешь рассказать сам)).
2
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6180 / 2875 / 1042
Регистрация: 01.06.2021
Сообщений: 10,544
24.04.2022, 23:54
Добавлю такие примеры:

Java
1
2
3
4
String s = "Hello";
String s1 = "Hel";
String s2 = "lo";
System.out.println(s == s1 + s2); // false
Java
1
2
String s = "Hello";
System.out.println(s == "Hel" + "lo"); // true
Java
1
2
3
String s1 = "Hello";
String s2 = "HELLO";
System.out.println(s1 == s2.toLowerCase()); // false
Java
1
2
String s = "Hello";
System.out.println(s == "HELLO".toLowerCase()); // false
Java
1
2
String s = "Hello";
System.out.println("HELLO" == s.toUpperCase()); // false
Java
1
2
3
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1.toUpperCase() == s2.toUpperCase()); // false
Java
1
2
3
String s1 = "Hello";
String s2 = s1;
System.out.println(s1.toUpperCase() == s2.toUpperCase()); // false
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2022, 23:54
Помогаю со студенческими работами здесь

Сравнение двух строк string
Добрый день. Никак не пойму почему не хочет работать такой способ сравнения двух string строк, сравнивает верно только если ввести...

Побуквенное сравнение строк string
Нужна ваша помощь. Требуется посимвольное сравнение двух строк типа string. Есть ли в стандартной библиотеке такая функция? Или нужно...

Подскажите с if на JAVA. Сравнение данных из базы с переменной String
Здравствуйте! Есть база на oracle, в ней таблица и необходимый мне столбец типа varchar2(300). Вывод: Почему не...

Сравнение строк с помощью String.Compare
Доброго времени суток. Нужна помощь с String.Compare. В общем, ввожу строку. Разбиваю сплитом на слова. Суть задачи найти одинаковые...

Сравнение строк string без учета регистра
Есть уже реализованная стандартная функция для решения такой задачи? Делал это через перевод обоих строк в нижний регистр и оператор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru