Переопределение метода java equals () — не работает?
я столкнулся с интересной (и очень неприятной) проблемой с equals() метод сегодня, который вызвал то, что я считал хорошо протестированным классом, чтобы разбиться и вызвать ошибку, которая заняла у меня очень много времени, чтобы отследить.
просто для полноты, я не использовал IDE или отладчик — просто старый добрый текстовый редактор и система.выход. Время было очень ограничено, и это был школьный проект.
я разрабатывал базовую корзину который может содержать ArrayList of Book объекты. В целях реализации addBook() , removeBook() и hasBook() методы тележки, я хотел проверить, если Book уже существовал в Cart . Так что я пошел —
все работает отлично в тестировании. Я создаю 6 объектов и заполнить их данными. Сделайте много операций добавления, удаления, has() на Cart и все работает нормально. Я читал, что вы можете либо equals(TYPE var) или equals(Object o) но предположил, что раз он работает, это не имеет большого значения.
затем я столкнулся с проблемой — мне нужно было создать Book объект только the ID в нем из книги класс. Никакие другие данные в него не вводились. В основном следующее:
внезапно, к equals(Book b) способ больше не работает. Это заняло очень много времени, чтобы отследить без хорошего отладчика и предполагая Cart класс был правильно протестирован и правильный. После swaapping в equals() метод следующим образом:
все снова начало работать. Есть ли причина, по которой метод решил не принимать параметр книги, хотя он явно был a
Источник
Не работает метод equals при распознавании текста
Доброго времени суток.
Используя существующую кодлабу по распознаванию текста: https://habr.com/ru/post/412679/
Пытаюсь добавить в существующий код оператор ( IF ).
Цель оператора — сравнение распознанного текста с образцом ( S1 или S2 ). При сравнении использую метод equals .
Добавлены строки 45-50 и 67-72.
Ошибка:error: cannot find symbol
if (s2.equals(item)) <
^
symbol: variable s2
location: class OcrDetectorProcessor
Всем заранее спасибо за ответы. я не программист, не судите строго(((((
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Метод двумерных моментов в распознавании изображений
Как его реализовать и где есть теоретическое описание алгоритма ?
TServerSocket и TServerClient — ошибка в их взаимодействии (в распознавании принятого текста)
Добрый вечер, у меня есть клиент-серверное приложение. Клиент отправляет серверу сообщение об.
Метод Equals
Подскажите, что делает данная ф-ция. Есть Arr(массив) и поле data(данные) public override bool.
Метод equals
Уважаемые коллеги,прошу прощения за глупый вопрос Не так давно изучаю JAVA, сломал мозг вот на.
Добавлено через 1 час 57 минут
Я исправил ошибку, но программа не работает как мне нужно.
Программа распознаёт текст, но вообще не происходит сравнения с ОБРАЗЦОМ.
Т.е. просто пишет на экране распознанный текст.
Номер строк с добавленным мною кодом 61 — 69.
Почему не отрабатывает КОД.
Метод equals
Правильно ли я тут определил метод equals, если у меня есть наследование? public class Vegetable.
Перегрузка == используя метод equals
Можно ли использовать метод Equals для сравнения двух списков list? Перегрузка == всегда возвращает.
Циклические зависимости, JPA, equals метод
Здравствуйте! Подскажите, пожалуйста, как лучше реализовать (или не реализовывать вообще:) ).
Метод Equals для значимых типов
Опять Рихтер, наверное многим на форуме это непонятно, но спустя год КОДЕРСТВА, я понял что пора.
Источник
Метод equals не работает правильно
Помогите разобраться, почему данный код выдает false?
2 ответа 2
Потому что в Java equals (по умолчанию, если этот метод не переопределен), сравнивает объекты по ссылке, т.е. вы создали два разных объекта book1 и book2 , переменные ссылаются на разные объекты, значит они не равны -> false . Чтобы это изменить нужно просто реализовать метод equals , который будет сравнивать названия книг, и если они равны возвращать true , тогда будет работать как ожидается.
book1 и book2 2 разные объекты, несмотря на то, какое у них значение поля book : (Это подобно тому, когда у 2 разных человека одинаковая фамилия — фамилия та же самая, но люди разны.)
(Другой подход: Эти объекты разные, потому что в ния возможно независимо изменить значение поля book .)
Потому общий метод .equаls() выдает false . Он не может заранее знать, что вы хотите считать одинаковым, потому он даст true только тогда, когда идет о тот же самый объект (т.е. когда адреса обоих объектов в памяти совпадают).
Вы можете переписать этот метод в вашем классе, когда вам нужно другое поведение.
Когда бы вы вместо
то book2 бы был тот же самый объект как book1 — значит, что book1.equals(book2) бы вернуло true : Изменяя значение поля book в объекте book1 изменится значение этого поля тоже в объекте book2 — book1 и book2 2 разные имена для того же самого объекта.
Источник
Разбираемся с hashCode() и equals()
Что такое хеш-код?
Если очень просто, то хеш-код — это число. На самом деле просто, не так ли? Если более точно, то это битовая строка фиксированной длины, полученная из массива произвольной длины (википедия).
Пример №1
Выполним следующий код:
В результате выполнения программы в консоль выведется целое 10-ти значное число. Это число и есть наша битовая строка фиксированной длины. В java она представлена в виде числа примитивного типа int , который равен 4-м байтам, и может помещать числа от -2 147 483 648 до 2 147 483 647. На данном этапе важно понимать, что хеш-код это число, у которого есть свой предел, который для java ограничен примитивным целочисленным типом int.
Вторая часть объяснения гласит:
полученная из массива произвольной длины.
Под массивом произвольной длины мы будем понимать объект. В 1 примере в качестве массива произвольной длины у нас выступает объект типа Object .
В итоге, в терминах Java, хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.
Этот метод реализован таким образом, что для одного и того-же входного объекта, хеш-код всегда будет одинаковым. Следует понимать, что множество возможных хеш-кодов ограничено примитивным типом int , а множество объектов ограничено только нашей фантазией. Отсюда следует утверждение: “Множество объектов мощнее множества хеш-кодов”. Из-за этого ограничения, вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.
Здесь главное понять, что:
- Если хеш-коды разные, то и входные объекты гарантированно разные.
- Если хеш-коды равны, то входные объекты не всегда равны.
Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.
Подведём итог:
Сперва, что-бы избежать путаницы, определимся с терминологией. Одинаковые объекты — это объекты одного класса с одинаковым содержимым полей.
- для одного и того-же объекта, хеш-код всегда будет одинаковым;
- если объекты одинаковые, то и хеш-коды одинаковые (но не наоборот, см. правило 3).
- если хеш-коды равны, то входные объекты не всегда равны (коллизия);
- если хеш-коды разные, то и объекты гарантированно разные;
Понятие эквивалентности. Метод equals()
Начнем с того, что в java, каждый вызов оператора new порождает новый объект в памяти. Для иллюстрации создадим какой-нибудь класс, пускай он будет называться “BlackBox”.
Пример №2
Выполним следующий код:
Создадим класс для демонстрации BlackBox .
Во втором примере, в памяти создастся два объекта.
Но, как вы уже обратили внимание, содержимое этих объектов одинаково, то есть эквивалентно. Для проверки эквивалентности в классе Object существует метод equals() , который сравнивает содержимое объектов и выводит значение типа boolean true , если содержимое эквивалентно, и false — если нет.
Эквивалентность и хеш-код тесно связанны между собой, поскольку хеш-код вычисляется на основании содержимого объекта (значения полей) и если у двух объектов одного и того же класса содержимое одинаковое, то и хеш-коды должны быть одинаковые (см. правило 2).
Я написал “должно быть”, потому что если вы выполните предыдущий пример, то на самом деле результатом выполнения всех операций будет false . Для пояснения причин, заглянем в исходные коды класса Object .
Класс Object
Как известно, все java-классы наследуются от класса Object . В этом классе уже определены методы hashCode() и equals() .
Определяя свой класс, вы автоматически наследуете все методы класса Object . И в ситуации, когда в вашем классе не переопределены ( @overriding ) hashCode() и equals() , то используется их реализация из Object .
Рассмотрим исходный код метода equals() в классе Object .
При сравнение объектов, операция “ == ” вернет true лишь в одном случае — когда ссылки указывают на один и тот-же объект. В данном случае не учитывается содержимое полей.
Выполнив приведённый ниже код, equals вернет true .
Теперь понято, почему Object.equals() работает не так как нужно, ведь он сравнивает ссылки, а не содержимое объектов.
Далее на очереди hashCode() , который тоже работает не так как полагается.
Заглянем в исходный код метода hashCode() в классе Object :
Вот собственно и вся реализация. Ключевое слово native означает, что реализация данного метода выполнена на другом языке, например на C, C++ или ассемблере. Конкретный native int hashCode() реализован на C++, вот исходники — http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp функция get_next_hash .
При вычислении хэш-кода для объектов класса Object по умолчанию используется Park-Miller RNG алгоритм. В основу работы данного алгоритма положен генератор случайных чисел. Это означает, что при каждом запуске программы у объекта будет разный хэш-код.
Получается, что используя реализацию метода hashCode() от класса Object , мы при каждом создании объекта класса new BlackBox() , будем получать разные хеш-коды. Мало того, перезапуская программу, мы будем получать абсолютно разные значения, поскольку это просто случайное число.
Но, как мы помним, должно выполняться правило: “если у двух объектов одного и того же класса содержимое одинаковое, то и хеш-коды должны быть одинаковые ”. Поэтому, при создании пользовательского класса, принято переопределять методы hashCode() и equals() таким образом, что бы учитывались поля объекта.
Это можно сделать вручную либо воспользовавшись средствами генерации исходного кода в IDE. Например, в Eclipse это Source → Generate hashCode() and equals().
В итоге, класс BlackBox приобретает вид:
Теперь методы hashCode() и equals() работают корректно и учитывают содержимое полей объекта:
Кому интересно переопределение в ручную, можно почитать Effective Java — Joshua Bloch, chapter 3, item 8,9.
Источник
string.equals not working for me
This is the useful part of code:
No output. But if I remove the if(classname.equals(«edit_body»)) condition it does print (in one of the iterations):
Can’t get the bug part. help!
I am using an external java library BTW for html parsing.
BTW there are two errors at the start of the output, which is there in both the cases, with or without if condition.:
Hope that wont cause the error
Ok guys, Somebody explain me please! «edit_body».equals(el.getAttributeValue(«class»)) worked!!
5 Answers 5
I had right now the exactly same problem.
I success to solve it by using: SomeStringVar.replaceAll(«\\P
This command remove all the Unicode characters in the variant (characteres that you cant see- the strings look like equal, even they not really equal).
I use this command on each variant i needed in the equalization, and it works for me as well.
Looks like you are having leading or trailing whitespaces in your classname .
This will trim any of those whitespaces at the ends.
Firstly, String.equals() is NOT broken. It works for millions of other programs / programmers. This is NOT the cause of your problems (unless you or someone has deliberately modified . and broken your Java installation . )
So why can two apparently equal strings compare as unequal?
- There could be leading or trailing whitespace characters on the String.
- There could be embedded non-printing characters.
- There could be pairs Unicode characters that look the same when you display them with a typical font, but in fact are not the same. For instance the Greek code page contains characters that look by Latin vowels . but are in fact different codes, and hence are not equal.
Источник