Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134

Как правильно сравнивать строки

31.01.2014, 02:16. Показов 3507. Ответов 13
Метки нет (Все метки)

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

Java
1
if(!textArea.getText().isEmpty()&&text1==text2)
условие не выполняется

но при проверке

Java
1
if(!textArea.getText().isEmpty()&&text1.equals(text2))
условие выполняется отлично.

то что текст 1 и текст 2 идентичен - уверен более чем на 100%,так как проверял его перед использованием методом

Java
1
2
3
4
5
6
7
8
9
10
11
    static boolean res;
    
     static boolean equals(String a,String b){
        
        if(a.equals(b)){
            res=true;
        }else{
            res=false;
        }       
        return res; 
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2014, 02:16
Ответы с готовыми решениями:

Как правильно сравнивать строки?
Добрый день! У меня возникла такая проблема. Не могу понять в чем дело. Имеется очень простой скрипт: for varname in tas ;...

Как правильно сравнивать строки с числами?
Здравствуйте! Первичный ключ в access, строка, содержащая число из 20 знаков. Как правильно её сравнить с вводимым числом в DBEdit1.Text?

Как правильно сравнивать объекты?
Есть такой код поиска public ActionResult PhoneDirectory(string nameText, string surnameText) { ...

13
4 / 4 / 2
Регистрация: 03.01.2012
Сообщений: 28
31.01.2014, 03:56
Java
1
text1==text2
Этим ты сравниваешь ссылки обьектов String. Так как текс1 и текст2 - разные обьекты, то и сравнивание ссылок выдает false
1
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 04:46
иквелс это конечно да и бесспорно, но если строки

Цитата Сообщение от WyPik Посмотреть сообщение
идентичен - уверен более чем на 100%
то вообще-то на них должна быть одна ссылка и соответственно должно вернуться true

видимо чево-то сделали со строками перед ифом
1
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
31.01.2014, 11:09
Лучший ответ Сообщение было отмечено WyPik как решение

Решение

Цитата Сообщение от WyPik Посмотреть сообщение
то что текст 1 и текст 2 идентичен - уверен более чем на 100%
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class StringEquals {
 
    public static void main(String[] args) {
        String s1 = new String("ololo");
        String s2 = new String("ololo");
        String s3 = s1;
 
        System.out.println("s1 == s2      " + (s1 == s2));
        System.out.println("s1 == s3      " + (s1 == s3));
        System.out.println("s1.equals(s2) " + (s1.equals(s2)));
    }
}
Bash
1
2
3
s1 == s2      false
s1 == s3      true
s1.equals(s2) true
вот, что бы понятнее стало насчет сравнения строк
2
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 18:19
verylazy, для полной картины осталось только вот так сделать и запустить

Java
1
2
String s1 = "ololo";
String s2 = "ololo";
1
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
31.01.2014, 18:32
я ждал этого вопроса, но не стал писать
точно знаю, что если писать new бла-бла то гарантированно создастся два разных объекта
а если писать
String s1 = "ololo";
String s2 = "ololo";
то выдаст true, это потому что строки где-то там кешируются
сейчас должны подтянуться более опытные парни, которые объяснят что-почем

Добавлено через 6 минут
забыл сказать главное вот как раз что бы не было казусов при сравнении строк, надо юзать equals вместо ==
тогда строки, даже созданные через new но с одинаковыми символами, будут при сравнении выдавать true
1
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
31.01.2014, 18:43  [ТС]
то вообще-то на них должна быть одна ссылка и соответственно должно вернуться true

видимо чево-то сделали со строками перед ифом
сделал,сравнил их в методе который описал выше и если бы метод выдал false код бы остановился.

вот, что бы понятнее стало насчет сравнения строк
Кое что новое узнал для себя.Но если сравнивать

Java
1
2
3
String a = "test";
String b = "test";
System.out.println(a==b);
как конкретно в моем случае,без создания ссылок на объект,то результат будет true.

Напишу более развернуто что проиходит именно с теми переменными которые не хотели сравниваться

1 переменная выглядит как
Java
1
public static String OpenFileText;
и в нее идет запись текста с метода открытия файла
Java
1
2
3
4
5
6
7
8
9
10
11
12
                BufferedReader br = new BufferedReader(new FileReader(s));
                try {
                    StringBuilder sb = new StringBuilder();
                    String line = br.readLine();
 
                    while (line != null) {
                        sb.append(line);
                        sb.append(System.lineSeparator());
                        line = br.readLine();
                    }
                    String everything = sb.toString();
                    Values.OpenFileText = everything;
вторая переменная получает свой текст напрямую от JTextArea
и в конечном виде мы имеем выражение

Java
1
if(Frame.a1.getText()==Values.OpenFileText)
которое не работает

тоесть я так понимаю метод area.gettext() создает новый объект типа стринг и по этому они не сравниваются?
а если переделать сравнение...ну например так

Java
1
2
String test = area.gettext
sysout(test==Values.OpenFileText)
таким отбразом по сути мы вроде бы исключили создание нового объекта и просто присвоили переменной текст,который находился в поле ввода и соответственно привели код к виду
Java
1
2
3
String a = "test";
        String b = "test";
        System.out.println(a==b);
в котором у нас 100% все сравнивалось.

Кстати да,переменные основного кода находятся в разных классах и пакетах,но вроде это не должно повлиять
0
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 19:22
Цитата Сообщение от verylazy Посмотреть сообщение
что бы не было казусов при сравнении строк, надо юзать equals вместо ==
вообщем, все равно вернулись к тому же

Не по теме:

что и требовалось... не фиг велосипеды изобретать

0
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
31.01.2014, 19:30
Для сравнения значений строк лучше использовать s1.equals(s2)...
1
касаткО
 Аватар для Jetu
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
31.01.2014, 19:47
Вообще со строками не все так просто, как кажется, в спецификации Java есть очень интересные моменты по поводу строк )
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
31.01.2014, 19:53  [ТС]
впринципе я то понял,как лучше делать но будущее,но почему в моем случае не сравнивалось,я так и не понял
0
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 20:01
Цитата Сообщение от WyPik Посмотреть сообщение
sb = new StringBuilder();
видимо отсюда все шло

Добавлено через 56 секунд
но точно только в отладке будет ясно
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
31.01.2014, 21:09  [ТС]
Цитата Сообщение от Wado-Ru Посмотреть сообщение
видимо отсюда все шло

Добавлено через 56 секунд
но точно только в отладке будет ясно
если еще раз посмотреть внимательно код,будет видно что стринг билдер превращается в стринг и присваивается переменной стринг

Java
1
String everything = sb.toString();
0
5 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 15
02.02.2014, 05:52
Да что тут писать? Достаточно запомнить одно простое правило, применительно к строкам: "equals сравнивает по значению, == сравнивает по ссылке". Все, проблем больше не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2014, 05:52
Помогаю со студенческими работами здесь

Как правильно сравнивать даты?
$data_old - в таблице типа 'date' форматом "Y.m.d". $today = date("Y.m.d"); if($data_old = $today){ ... } почему-то условие не...

Как правильно сравнивать несколько строк
здравствуйте, что-то такая конструкция ошибку выдаёт, подскажите как правильно, спасибо If Первое_второе_слово_9_строки =...

Можно ли сравнивать строковые литералы? как правильно это сделать?
надо сравнить введенный строковый литерал с одним из доступных. int main() { setlocale(0,""); char const s =15; ...

Как правильно хранить юникод-символы в строках, сравнивать и выводить их?
Мне нужно хранить юникод символы в строках, сравнивать и выводить их. Символы не сравниваются и выводятся вопросами. В чём проблема? ...

Как правильно сравнивать подстроки строк и заменять их (нельзя использовать str.replace)?
#include <iostream> #include <string> int main() { std::string str; getline(std::cin,str); const int n = 5; std::string...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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