1

用java思考 说:

要从 AbstractList 创建只读列表,您必须实现 get() 和 size()。

这让我很困惑,代码如下:

 public class CountingIntegerList
extends AbstractList<Integer> {
  private int size;
  public CountingIntegerList(int size) {
    this.size = size < 0 ? 0 : size;
  }
  public Integer get(int index) {
    return Integer.valueOf(index);
  }
  public int size() { return size; }
  public static void main(String[] args) {
    List list = new CountingIntegerList(30);
  }
}

列表是只读列表吗?为什么?

好的,答案是肯定的,因为我扩展AbstractList并抛出UnsupportedOperationExceptionif setorand被调用。如果我想得到一个unmodifiableList,Collections.unmodifiableList()是一个不错的选择。但请记住,它们都不是一成不变的:

      List<StringBuilder> list = new ArrayList<StringBuilder>();
      StringBuilder sb = new StringBuilder();
      sb.append("hello");
      list.add(sb);
      System.out.println(list);
      list = Collections.unmodifiableList(list);
      sb.append("world");
      System.out.println(list);

里面有一个flyweight patternCountingIntegerList因为每次get()调用,它都从 Integer 中获取缓存,源代码valueOf()

   public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

对吗?

4

5 回答 5

5

它是只读的(甚至是不可变的),因为add会抛出UnsupportedOperationExceptionas will remove

AbstractList为您处理创建迭代器、计算哈希码和相等性的所有工作。这很有帮助。完全没有必要换行unmodifiableList

后来你问是否AbstractList主要用于创建不可修改的列表。实际上它用于创建任何类型的随机访问列表。在我的数据结构课程中,我们使用诸如此类的抽象类来节省实现列表类的大部分工作。甚至Collection接口也有 13 个方法,除了其中两个之外,所有方法都是由AbstractCollection.

有一个相关的类AbstractSequentialList可以帮助创建非随机访问的列表(例如链表)。

于 2013-04-24T13:33:57.670 回答
4

因为set如果未实现,则会引发 UnsupportedOperationException。见API

于 2013-04-24T13:31:19.173 回答
4

您可以将您的列表包装在UnmodifiableList中

List readOnlyList = Collections.unmodifiableList(yourList)
于 2013-04-24T13:32:55.663 回答
1

将 ArrayList 传递给Collections.unmodifiableList()

返回指定列表的不可修改视图。此方法允许模块为用户提供对内部列表的“只读”访问权限。对返回列表的查询操作“通读”到指定列表,并尝试修改返回的列表,无论是直接还是通过其迭代器,都会导致 UnsupportedOperationException。如果指定的列表是可序列化的,则返回的列表将是可序列化的。同样,如果指定的列表执行,则返回的列表将实现 RandomAccess。

于 2013-04-24T13:32:34.133 回答
0

这有点棘手。列表不能改变和/或元素也不能改变?;)

StringBuilder builder = new StringBuilder();
    builder.append("Hello");
    List<StringBuilder> list = new ArrayList<StringBuilder>();
    list.add(builder);

    Collection<StringBuilder> canNotChange = Collections.unmodifiableCollection(list);
    builder.append(" World");
    System.out.println(canNotChange.iterator().next());
于 2013-04-24T13:54:08.423 回答