ArrayList не использует переопределенные равно - PullRequest
10 голосов
/ 06 июля 2011

У меня проблема с получением ArrayList для правильного использования переопределенных равных. проблема в том, что я пытаюсь использовать равенства для проверки только для одного ключевого поля, и с помощью ArrayList.contains () для проверки существования объекта с правильным полем. Вот пример

public class TestClass  {
    private static class InnerClass{    
    private final String testKey;
    //data and such

    InnerClass(String testKey, int dataStuff) {
        this.testKey =testKey;
        //etc
    }
    @Override
    public boolean equals (Object in) {
        System.out.println("reached here");
        if(in == null) {
        return false;
        }else if( in instanceof String) {
        String inString = (String) in;
        return testKey == null ? false : testKey.equals(inString);
        }else {
        return false;
        }       
    }       
    }

    public static void main(String[] args) {    
    ArrayList<InnerClass> objectList = new ArrayList<InnerClass>();
    //add some entries
    objectList.add(new InnerClass("UNIQUE ID1", 42));
    System.out.println( objectList.contains("UNIQUE ID1")); 
    }    
}

Что меня беспокоит, так это то, что я не только получаю ложные данные на выходе, но я также не получаю вывод "достигнуто здесь".

У кого-нибудь есть идеи, почему это переопределение полностью игнорируется? Есть ли какая-то тонкость с переопределениями и внутренними классами, о которых я не знаю?

Edit: Возникли проблемы с сайтом, поэтому я не могу отметить ответ. Спасибо за быстрый ответ: да, упущение с моей стороны, что называется String .equals, а не мой пользовательский. Полагаю, сейчас это старомодные чеки

Ответы [ 11 ]

0 голосов
/ 06 июля 2011

Хотя вы не отвечаете на ваш вопрос, многие Коллекции используют hashcode(). Вы также должны переопределить это, чтобы «согласиться» с equals().

На самом деле, вы должны всегда применять оба equals и hashcode вместе, и они всегда должны быть согласованы друг с другом. Как говорится в Javadoc для Object.equals():

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределен, чтобы поддерживать генеральный контракт на Метод hashCode, который утверждает, что равные объекты должны иметь одинаковый хеш коды.

В частности, многие Коллекции полагаются на соблюдение этого контракта, иначе поведение не определено.

...