Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789

Почему не равны 2 строковых переменных

18.12.2017, 14:41. Показов 1986. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот класс с именем Quest7.java

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Book
{
    private String book;
    public void setBook (String b)
    {
        book = b;
    }
}
public class Quest7
{
    public static void main (String [] args)
    {
        Book book1 = new Book ();
        book1.setBook ("Java 7");
        Book book2 = new Book ();
        book2.setBook ("Java 7");
        if (book1.equals(book2))
        {
            System.out.println ("True");
        }
        else
        {
            System.out.println ("False");
        }
    }
}


Используется для сравнения строковых значений 2-х разных объектов . Для этого используется метод equals(), наследуемый от класса суперкласса (родителя всех классов) Object.

Значения каждого объекта в виде строковых литералов , одинаковы это видно, поэтому if должен выдать TRUE, так почему же выдает FALSE ???

"Java 7" - Вот такой строковый литерал находится в пуле строк, и если создается 2-й объект и ему в качестве значения присваивается такое же "Java 7", то эти значения в пуле строк (который находится в heap) - не дублируются, как я
понимаю...

Если же все не так, объясните доступным языком как это понимать.

Добавлено через 9 минут
Java
1
book1.setBook ("Java 7")
Или если вот так создается объект, то строковый литерал "Java 7" занимает отдельное место в динамической памяти ?

Java
1
book1.setBook ("Java 7")
Этот 2-й строковый литерал "Java 7" занимает то же отдельное место ?

Добавлено через 2 минуты
Ну даже если так, то ведь значения этих объектов должны быть одинаковы, я же не адреса их сравниваю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2017, 14:41
Ответы с готовыми решениями:

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

Сравнение строковых переменных
сделал код section .data boss db "Hello boss",0 guest db "Hello guest" SECTION .text global greet greet: cmp edi, esi ...

Ввод строковых переменных
Не могу понять - почему в данном коде вводится только одна строковая переменная, затем сразу выводится и выполнение прекращается? Причем...

14
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
18.12.2017, 15:01
Вы сами переопределяете метод equals. Переопределите на сравнение строковых полей, правильно и будет вам TRUE.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
18.12.2017, 15:25
типа того:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Book {
    private String book;
 
    public String getBook() {
        return book;
    }
 
    public void setBook(String book) {
        this.book = book;
    }
 
    public Book(String book) {
        this.book = book;
    }
 
    @Override
    public boolean equals(Object obj) {
        Book book = (Book) obj;
        return this.book.equals(book.getBook());
    }
 
    @Override
    public String toString() {
        return book;
    }
}
public class Quest7 {
    public static void main (String [] args) {
        Book book1 = new Book ("Java 7");
        Book book2 = new Book ("Java 7");
        System.out.println(book1.equals(book2));
    }
}
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
18.12.2017, 15:32
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
123
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
18.12.2017, 15:43
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Book {
    private String bookName;
 
    public Book(String book) {
        this.bookName = book;
    }
 
    public boolean equals(Book otherBook) {
        return this.bookName.equals(otherBook.bookName);
    }
 
}
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
18.12.2017, 15:58
да на каждом же заборе написано:
желательно делать @Override методам equals и hashcode
НЕ желательно делать overload методу equals

любая IDE по вашей просьбе правильно сгенерирует нужный код методов equals и hashcode
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
18.12.2017, 15:59
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Book {
    private String book;
 
    public String getBook() {
        return book;
    }
 
    public void setBook(String book) {
        this.book = book;
    }
 
    public Book(String book) {
        this.book = book;
    }
 
    @Override
    public boolean equals(Object obj) {
        boolean result = obj != null;
        if (result) {
           Book b = (Book) obj;
           result = hashCode() == b.hashCode() && book.equals(b.getBook())
        }
        return result;
    }
 
    @Override
    public String toString() {
        return book;
    }
 
    @Override
    public int hashCode() {
        return book.hashCode();
    }
}
public class Quest7 {
    public static void main (String [] args) {
        Book book1 = new Book ("123");
        Book book2 = new Book ("12");
        System.out.println(book1.equals(book2));
    }
}
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
18.12.2017, 15:59
вот...еще один...
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
18.12.2017, 16:42
Цитата Сообщение от masli Посмотреть сообщение
так почему же выдает FALSE ???
Потому, что ты сравниваешь объекты типа Book, а не String.
Ты же сам пишешь:
Цитата Сообщение от masli Посмотреть сообщение
Используется для сравнения строковых значений 2-х разных объектов .
Добавлено через 1 минуту
2-х разных объектов.

Добавлено через 1 минуту
Только сравниваются не строковые значения, а сами объекты.
0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
18.12.2017, 17:04  [ТС]
Цитата Сообщение от Pablito Посмотреть сообщение
вот...еще один...
поясните пожайлуста, что вы имеете ввиду ?
Кто в чем не прав и почему?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
18.12.2017, 17:15
Цитата Сообщение от masli Посмотреть сообщение
поясните пожайлуста, что вы имеете ввиду
ну там немного был другой код, его исправили, но все равно это все рухнет если например в конструктор или через сеттер передать null
этот метод немного странный
Java
1
2
3
4
5
6
7
8
9
  @Override
    public boolean equals(Object obj) {
        boolean result = obj != null;
        if (result) {
           Book b = (Book) obj;
           result = hashCode() == b.hashCode() && book.equals(b.getBook())
        }
        return result;
    }
что за result, к чему он там?

у меня например IDE предлагает переопределить методы так
Java
1
2
3
4
5
6
7
8
9
10
11
12
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return bookName != null ? bookName.equals(book.bookName) : book.bookName == null;
    }
 
    @Override
    public int hashCode() {
        return bookName != null ? bookName.hashCode() : 0;
    }
0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
18.12.2017, 17:15  [ТС]
Цитата Сообщение от Хм Посмотреть сообщение
Только сравниваются не строковые значения, а сами объекты.
Так метод equals()

Java
1
Метод equals() — сравнивает строку с указанным объектом. Результатом является значение true только в том случае, если аргумент не равен null и является строковым объектом (String), который представляет ту же последовательность символов как и этот объект.
Эти объекты ведь оба строковые.
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
18.12.2017, 17:34
Цитата Сообщение от masli Посмотреть сообщение
Эти объекты ведь оба строковые.
Ты в строке 17 сравниваешь book1 и book2, а это не строки. Это объекты класса Book.

Добавлено через 4 минуты
Метод equals() используется для сравнения не только строк.
Сотни классов используют метод equals() для сравнения своих объектов.
Для этого необходимо этот метод настроить (переопределить) для работы в конкретном классе.
1
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
18.12.2017, 20:30
Цитата Сообщение от Pablito Посмотреть сообщение
что за result, к чему он там?
Просто меня учили, что хорошо, если в методе 1 return и в конце. А не несколько.
Т.к. код так легче читать
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
19.12.2017, 09:01
Цитата Сообщение от ArtemFM Посмотреть сообщение
меня учили,
ну, батенька, на вас совсем не похоже((. Ответственность на учителей перекладывать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2017, 09:01
Помогаю со студенческими работами здесь

Двойной backslash в строковых переменных
Имеем следующии код if(!MoveFiles("C:\\Users\Admin\\Dropbox\\C++ Bulder 6\\Ruestr\\Skin\\", "c:\\")) ...

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

Сложение строковых переменных в столбце
Добрый день коллеги! У меня есть примерно такая таблица Пардон... заголовок не правильный. Не переменных, а строковых значений. ...

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

Обработка символьных и строковых переменных.
Индивидуальное задание Дана строка, состоящая из слов, разделённых пробелами. Отредактировать его так , чтобы между каждой парой слов...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru