0

我正在阅读Core Java Volume I - fundamentals (9th edition) by Cay S. Horstmann and Gary Cornell。这是书中的一段我不明白。如果你能用一个简单的例子来说明它的含义,那就太好了。谢谢

List<String> staff = new LinkedList<>();
.....
lookAt(Collections.unmodifableList(staff));
.....
.....
.....

段落: undmodifiableCollection 方法返回一个集合,其 equal 方法不调用底层集合的 equals 方法。相反,它继承了 object 类的 equals 方法,该方法只是测试对象是否相同。如果你将一个集合或列表变成一个集合,你就不能再测试相同的内容了。视图以这种方式运行是因为相等性测试在此层次结构级别上没有明确定义。视图以相同的方式处理哈希码方法。但是,unmodifiableSet 和 unmodifiableList 方法使用底层集合的 equals 和 hashCode 方法。

4

2 回答 2

2
List<String> list1 = new ArrayList<String>();
list1.add("foo");
List<String> list2 = new ArrayList<String>();
list2.add("foo");

System.out.println("Are lists equal: " + list1.equlas(list2));
System.out.println("Are unmod collections equal: " + 
  Collections.unmodifiableCollection(list1).equals(
  Collections.unmodifiableCollection(list2)));
System.out.println("Are unmod lists equal: " + 
  Collections.unmodifiableList(list1).equals(
  Collections.unmodifiableList(list2)));
于 2013-11-06T19:24:17.757 回答
2

通常,两个不是同一个列表但具有相同内容的列表被认为是相等的。两个具有相同内容的不可修改列表同样相等。

另一方面,两个不可修改的集合并不相等,因为它们具有相同的内容。

        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(Integer.valueOf(1));
        list1.add(Integer.valueOf(2));
        List<Integer> list2 = new LinkedList<Integer>();
        list2.add(Integer.valueOf(1));
        list2.add(Integer.valueOf(2));
//True!
        System.out.println(list1.equals(list2));

        List<Integer> unModList1 = Collections.unmodifiableList(list1);
        List<Integer> unModList2 = Collections.unmodifiableList(list2);
//True!
        System.out.println(unModList1.equals(unModList2));

        Collection<Integer> unModColl1 = Collections.unmodifiableCollection(list1);
        Collection<Integer> unModColl2 = Collections.unmodifiableCollection(list2);
//False
        System.out.println(unModColl1.equals(unModColl2));
于 2013-11-06T19:24:33.987 回答