Как Collections.unmodifiableCollection использует метод equals? - PullRequest
0 голосов
/ 08 февраля 2019

Метод unmodifiableCollection (а также методыsynchronizedCollection и checkedCollection, рассмотренные далее в этом разделе) возвращает коллекцию, метод equals которой не вызывает метод equals базовой коллекции.Вместо этого он наследует метод equals класса Object, который просто проверяет идентичность объектов.Если вы превратите набор или список в просто коллекцию, вы больше не сможете проверять одинаковое содержимое.Представление действует таким образом, потому что тестирование на равенство не очень хорошо определено на этом уровне иерархии.Представления обрабатывают метод hashCode таким же образом. Однако методы unmodifiableSet и unmodifiableList используют методы equals и hashCode базовых коллекций.

Этот фрагмент взят из ядра книги Java, затем я пишунекоторый код, чтобы проверить это:

package collection.view;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;


public class ColsOf {
    public static void main(String[] args) {

        List<TestEqual> list1=new ArrayList<>();
        TestEqual e1 = new TestEqual(5, 3);TestEqual e2 = new TestEqual(5, 3);
        System.out.println(e1==e2);System.out.println(e1.equals(e2));
        list1.add(e1);
        List<TestEqual> imutableList = Collections.unmodifiableList(list1);
        System.out.println(imutableList.contains(e2));
        Collection<TestEqual> imutableColl = Collections.unmodifiableCollection(list1);
        System.out.println(imutableColl.contains(e2));

    }

}

class TestEqual{
    int i;
    int j;
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return i*100+j;
    }
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return this.hashCode()==obj.hashCode();
    }
    public TestEqual(int i, int j) {
        super();
        this.i = i;
        this.j = j;
    }

}

Запустите код, результат:

false
true
true
true

, чтобы я мог видеть e1==e2 ложно, но imutableColl.contains(e2) верно

если при вызове метода contains imutableColl проверяет местоположение в памяти, но не содержимое, тогда imutableColl.contains(e2) должно быть ложным, почему это так?

Если проблема в contains метод, тогда как проверить точку, описанную в книге?

1 Ответ

0 голосов
/ 08 февраля 2019

Отрывок, который вы представили из документов Collections.unmodifiableCollection(), касается метода equals() объектов Collection, которые он возвращает, как в

immutableColl.equals(anotherColl)

Это не имеет ничего общего сметод contains() коллекций, который подчиняется контракту Collection.contains(), так же, как он должен:

возвращает true, если и только если эта коллекция содержит хотя бы один элемент e такой, что (o==null ? e==null : o.equals(e)).

Это именно то, что вы сообщаете о наблюдении.Также обратите внимание, что, хотя в контрактах List и Set указаны подробности поведения методов реализации equals(), в контракте на Collections.equals() явно отказывается от любых требований переопределять Object.equals().

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