Sea*_*oyd 17
你可以这样做:
List<X> list = Arrays.asList(new X[desiredSize]);
// where X is any Object type (including arrays and enums,
// but excluding primitives)
Run Code Online (Sandbox Code Playgroud)
结果列表是可以修改的,但不能调整大小(即add(e)和remove(e)不工作,但set(index, e)一样).
参考:
或者:使用Guava,这是一个静态方法,用于装饰具有最大大小的现有List
public static <T> List<T> setMaxSize(
final List<T> input, final int maxSize){
return new ForwardingList<T>(){
@Override
public boolean addAll(Collection<? extends T> collection){
return standardAddAll(collection);
}
@Override
public boolean addAll(int index, Collection<? extends T> elements){
return standardAddAll(index, elements);
}
public boolean add(T e) {
checkMaxSize();
return delegate().add(e);
}
@Override
public void add(final int index, final T e){
checkMaxSize();
delegate().add(index, e);
}
private void checkMaxSize(){
if(size() >= maxSize){
throw new UnsupportedOperationException("Maximum Size "
+ maxSize + " reached");
}
}
@Override
protected List<T> delegate(){
return input;
}
};
}
Run Code Online (Sandbox Code Playgroud)
由于所有标准集合类型都存在ForwardingXxx类,因此您也可以为其他集合编写类似的装饰器.
显然,这仅在您的客户端代码使用装饰集合时才有效.如果您更改了底层集合,则会被搞砸(就像Collections.unmodifiableXXX方法一样)
参考:
ArrayBlockingQueue并且LinkedBlockingQueue都支持最大尺寸.LinkedHashMap支持在达到最大尺寸时逐出最旧或最近最少使用的物品.
达到最大尺寸时,您希望它做什么?
| 归档时间: |
|
| 查看次数: |
38447 次 |
| 最近记录: |