Метод 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
метод, тогда как проверить точку, описанную в книге?