设置集合的最大大小的任何方法?

Jar*_*rek 21 java collections

有没有办法在Java中设置最大的集合大小?

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方法一样)

参考:


Pet*_*rey 7

ArrayBlockingQueue并且LinkedBlockingQueue都支持最大尺寸.LinkedHashMap支持在达到最大尺寸时逐出最旧或最近最少使用的物品.

达到最大尺寸时,您希望它做什么?