一个例子来说明Java中unmodifiableCollection的这一点?

时间:2013-11-06 19:16:55

标签: java collections unmodifiable

我正在阅读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方法。相反,它继承了对象类的equals方法,它只测试对象是否相同。如果将集合或列表转换为集合,则无法再测试相同的内容。视图以这种方式起作用,因为在此级别的层次结构中没有明确定义相等性测试。视图以相同的方式处理哈希码方法。    但是,unmodifiableSet和unmodifiableList方法使用底层集合的equals和hashCode方法。

2 个答案:

答案 0 :(得分: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)));

答案 1 :(得分: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));