Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
WyPik
Форумчанин
4626 / 3628 / 367
Регистрация: 28.12.2013
Сообщений: 19,825
1

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

31.01.2014, 02:16. Просмотров 2729. Ответов 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)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 02:16
Ответы с готовыми решениями:

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

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

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

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

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

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

видимо чево-то сделали со строками перед ифом
1
verylazy
Заблокирован
31.01.2014, 11:09 4
Лучший ответ Сообщение было отмечено 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
Wado-Ru
236 / 235 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 18:19 5
verylazy, для полной картины осталось только вот так сделать и запустить

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

Добавлено через 6 минут
забыл сказать главное вот как раз что бы не было казусов при сравнении строк, надо юзать equals вместо ==
тогда строки, даже созданные через new но с одинаковыми символами, будут при сравнении выдавать true
1
WyPik
Форумчанин
4626 / 3628 / 367
Регистрация: 28.12.2013
Сообщений: 19,825
31.01.2014, 18:43  [ТС] 7
то вообще-то на них должна быть одна ссылка и соответственно должно вернуться 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
Wado-Ru
236 / 235 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 19:22 8
Цитата Сообщение от verylazy Посмотреть сообщение
что бы не было казусов при сравнении строк, надо юзать equals вместо ==
вообщем, все равно вернулись к тому же

Не по теме:

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

0
ildwine
Супер-модератор
4712 / 2216 / 1263
Регистрация: 04.03.2013
Сообщений: 5,222
Записей в блоге: 1
31.01.2014, 19:30 9
Для сравнения значений строк лучше использовать s1.equals(s2)...
1
Jetu
касаткО
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
Завершенные тесты: 1
31.01.2014, 19:47 10
Вообще со строками не все так просто, как кажется, в спецификации Java есть очень интересные моменты по поводу строк )
0
WyPik
Форумчанин
4626 / 3628 / 367
Регистрация: 28.12.2013
Сообщений: 19,825
31.01.2014, 19:53  [ТС] 11
впринципе я то понял,как лучше делать но будущее,но почему в моем случае не сравнивалось,я так и не понял
0
Wado-Ru
236 / 235 / 72
Регистрация: 02.07.2013
Сообщений: 881
31.01.2014, 20:01 12
Цитата Сообщение от WyPik Посмотреть сообщение
sb = new StringBuilder();
видимо отсюда все шло

Добавлено через 56 секунд
но точно только в отладке будет ясно
0
WyPik
Форумчанин
4626 / 3628 / 367
Регистрация: 28.12.2013
Сообщений: 19,825
31.01.2014, 21:09  [ТС] 13
Цитата Сообщение от Wado-Ru Посмотреть сообщение
видимо отсюда все шло

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

Java
1
String everything = sb.toString();
0
Soer
5 / 2 / 1
Регистрация: 10.03.2013
Сообщений: 15
02.02.2014, 05:52 14
Да что тут писать? Достаточно запомнить одно простое правило, применительно к строкам: "equals сравнивает по значению, == сравнивает по ссылке". Все, проблем больше не будет.
0
02.02.2014, 05:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 05:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.