2013-02-12 2 views
1

Я пытаюсь сравнить два объекта, чтобы увидеть, являются ли они одинаковыми. Я создаю первый список из кода JSON и заполняю List (data) экземпляром InstructionModel. Затем я сравниваю данные с базой данных, выбирая данные и создавая новый экземпляр (модель) InstructionModel. Но результат всегда ложный, что я делаю неправильно в своем коде?Сравнение двух экземпляров одного и того же объекта в списке

exists = data.contains(model); 

if(!exists) 
{ 
    //Do Some Stuff Here 
} 

Данные из List<InstructionModel>: enter image description here Данные в InstructionModel Объект: enter image description here

+1

Откуда вы знаете, что результат всегда неверный? –

+5

Как 'equals' реализован в' InstructionModel'? Если это не переопределено, то 'contains' проверяет, присутствует ли фактический объект, что, конечно, ложно. –

+2

Вы реализовали равные? –

ответ

8

Вы должны переопределить Equals-метод для класса InstructionModel. В этом методе вы сравниваете свои значения и возвращаете true, если они совпадают, false, если они этого не делают.

Функция List#contains будет использовать функцию объектов в контейнере Object#equals. Если эта функция не переопределена, она будет сравнивать только ссылки, а не фактические значения.

Дополнение: Как отмечают комментарии, если вы переопределите метод 'equals', то вам также необходимо переопределить метод hashCode (и наоборот). Коллекции будут работать с этими методами для сравнения ваших экземпляров объектов. Например: если вы не переопределите оба варианта, два экземпляра могут считаться одинаковыми в списке, но не то же самое в 'Hashmap'.

+3

И помните, что метод hashcode также должен быть переопределен, поэтому, если 'a.equals (b)', то 'a.hashCode() == b.hashCode();' – SJuan76

+0

@ SJuan76 Я понимаю переопределение метода equals, но почему Должен ли я переопределить метод hashCode? и с чем я это переопределяю? – ios85

+0

Поскольку в его спецификациях указано, что указанное выше свойство должно быть истинным. Многие логики ожидают, что это будет правда (например, 'HashMap' и т. П.). – SJuan76

1

Возможно, вы захотите переопределить метод equals на InstructionModel.

Смежные вопросы