可设置容量的List继承于LinkedList

 场景:项目中需要将搜索历史存入本地,并且只保存最近搜索的10条记录,故此发现LinkedList中有实现了removeFirst可以很好的实现此需求,代码如下:

/**
 * Created by Zorro on 2019/11/14.
 * 备注:固定长度List
 * 如果List里面的元素个数大于了缓存最大容量,则删除链表的头元素
 */
public class FixSizeLinkedList<E> extends LinkedList<E> {
    private static final long serialVersionUID = 3292612616231532364L;
    // 定义缓存的容量
    private volatile int capacity;


    public FixSizeLinkedList(int capacity) {
        super();
        this.capacity = capacity;
    }

    public FixSizeLinkedList(Collection<? extends E> c, int capacity) {
        this(capacity);
        addAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        Iterator<? extends E> iterator = iterator();
        Iterator<? extends E> addIterator = c.iterator();
        if (iterator.hasNext()) {//原集合有数据需要组合判断
            if (addIterator.hasNext()) {//原集合无数据时只需判断新集合长度
                for (int i = 0; i < c.size(); i++) {
                    add(addIterator.next());
                }
            }
        } else {
            if (addIterator.hasNext()) {//原集合无数据时只需判断新集合长度
                while (c.size() > capacity) {
                    addIterator.next();
                    addIterator.remove();
                }
            }
            return super.addAll(c);
        }
        return true;
    }

    @Override
    public boolean add(E e) {
        // 超过长度,检索并删除此列表的头
        if (size() + 1 > capacity) {
            super.removeFirst();
        }
        return super.add(e);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值