用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
并抛出UnsupportedOperationException
if set
orand
被调用。如果我想得到一个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 pattern
。CountingIntegerList
因为每次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);
}
对吗?