原创作品,转载请注明出处:http://blog.csdn.net/qiujuer/article/details/40298761

有时候我有这样的需求:在一个程序的操作中我需要保存历史记录,或者存储一些信息;但我不希望这个数据在内存中是无限量增加的。简单的说,就是使用数组或者链表但是我不希望其无限量的增长,我只需要保存最近的20或者30条记录就ok,多了我不要。

就上面的需求来说,可能我们可以直接通过一定的方法对数组或者链表进行一定的操作(满了就删除第一个)就能实现对应的需求,当然也可以二次封装。

我最初的实现方式如下:

首先建立一个接口:

import java.util.Deque;
import java.util.List;/*** Created by QiuJu* on 2014/9/23.*/
public interface FixedList<T> extends List<T>, Deque<T>, Cloneable, java.io.Serializable {/*** 向最后添加一个新的* 如果长度超过允许的最大值,则弹出一个*/T addElement(T addLast);/*** 获得最大阈值** @return 阈值*/int getMaxSize();/*** 设置最大存储范围** @return 因为改变了队列大小,导致弹出的头部数据*/List<T> setMaxSize(int maxSize);/*** 转换为List数据* @return List*/List<T> toList();
}

这个接口集成了List、队列、以及实例化使用的类

而后我实现了这个接口:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class FixedLinkedList<T> extends LinkedList<T> implements FixedList<T> {private transient int maxSize = Integer.MAX_VALUE;public FixedLinkedList() {super();}public FixedLinkedList(int maxSize) {super();this.maxSize = maxSize;}@Overridepublic T addElement(T addLast) {T head = null;while (size() >= maxSize) {head = poll();}addLast(addLast);return head;}@Overridepublic List<T> setMaxSize(int maxSize) {List<T> list = null;if (maxSize < this.maxSize) {list = new ArrayList<T>();while (size() > maxSize) {list.add(poll());}}this.maxSize = maxSize;return list;}@Overridepublic List<T> toList() {List<T> list = new ArrayList<T>();list.addAll(this);return list;}@Overridepublic int getMaxSize() {return this.maxSize;}
}

实现接口也相对简单,无非就是添加判断删除,改变大小时弹出多余的就OK。

使用方法也简单:

FixedList<String> fixed = new FixedLinkedList<String>(10);
//添加元素
fixed.addElement("1");
fixed.addElement("2");
fixed.addElement("3");
fixed.setMaxSize(5);
//转换为List
List<String> fixedList = fixed.toList();

实现功能是实现了,但是对于我这个有完美情节的人来说心里始终有个疙瘩;因为其添加元素只能使用 addElement() 方法,不能使用默认的 add() 方法,默认方法不知道删除多余数据的,当然这也是这种实现方式的短板。为了解决这个问题,我查看了 Java 对 List 的 实现,查看了其对 ArrayList 和 LinkedList 的实现,发现针对上面的需求使用 ArrayList 是不恰当的,因为其需要经常删除元素,如果使用 ArrayList 将会涉及到重复拷贝的问题。所以打算重写 LinkedList 类。

重写当然是个漫长的过程,不过真的非常感谢国外的大牛对 LinkedList 的贡献,站在巨人肩膀上就是好,重写后的操作为下:

// ===================FixedList===================
// 固定长度队列
// 可指定长度,使用方法与普通队列类似
// 当加入元素数量达到指定数量时将弹出元素
// 头部插入尾部弹出,尾部插入头部弹出// 初始化最大长度为5
FixedList<Integer> list = new FixedList<Integer>(5);
// 添加元素
list.add(1);
// 末尾插入元素与add一样
list.addLast(1);
// 从头部插入,默认删除尾部超出元素
list.addFirst(19);
// 添加一个列表
list.addAll(new ArrayList<Integer>());// 获取最大容量
list.getMaxSize();
// 调整最大长度;缩小长度时将自动删除头部多余元素
list.setMaxSize(3);// 采用poll方式弹出元素
int i = list.poll();
// remove 与 poll 类似,不过不返回删除元素,仅删除一个元素
list.remove();
// 清空操作
list.clear();// 可使用List操作
List<Integer> list1 = new FixedList<Integer>(2);
list1.add(1);
list1.clear();

可以看出其能完全使用 LinkedList 的方法来操作,只不过多加入了获取最大容量以及设置最大容量的方法。

这下心里舒服多了,对了源码较多我给个链接:源码

如果觉得不错,可以看看我的开源项目:

Genius-Android

[Java] 固定队列的实现思路相关推荐

  1. java使用队列实现栈思路_算法面试:队列实现栈的方案

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇介绍的是如何用两个队列实现栈的问题.这道题作为上一篇文章算法面试:栈实现队列 ...

  2. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  3. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  4. 10分钟搞定 Java 并发队列好吗?好的

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  5. Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析

    转载自  Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析 Java中的阻塞队列接口BlockingQueue继承自Queue接口. Block ...

  6. java 栈 队列 接口_Java队列接口

    java 栈 队列 接口 介绍: 队列是FIFO(先进先出)抽象数据类型(ADT). 换句话说,按插入顺序将元素删除. java.util.Queue是Java 中的接口,并且从java.util.C ...

  7. Java 线上问题排查思路与工具使用

    本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 Java 语言是当前互联网应用最为广泛的语 ...

  8. java用队列实现栈、用栈实现对队列

    目录 用队列实现栈 用栈实现对队列 LeetCode题 225. 用队列实现栈 232. 用栈实现队列 用队列实现栈 思路: 1.创建两个队列, 2.哪个队列不为空就将要push的元素放到该队列中,若 ...

  9. Java环形队列(史上最易懂)

    Java环形队列 史上最易懂 1.什么是队列 2.数组模拟队列 3.Java代码实现 3.1环形队列类 3.2代码测试类 3.3完整Java代码 3.4输出结果 1.什么是队列 队列是一种数据结构,用 ...

  10. Java短连接生成工具-思路

    Java短连接生成工具-思路-这里只是模拟一下 package com.csrs.trans.shorturl;import java.util.HashMap; import java.util.M ...

最新文章

  1. 2018中国AI英雄风云榜:投出你心目中的中国AI领军人!
  2. 监控haproxy的脚本
  3. 06540计算机网络考试大纲,2020年自考06540计算机网络基本原理复习资料(7)
  4. 内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的
  5. 解决安装Weblogic domain卡住问题(Primeton BPS)
  6. Linux下文件的压缩和解压
  7. Raft协议选举核心思想
  8. 构建集中式会话的分析与实践(一)
  9. Jquery Easyui Datagrid创建代码
  10. 阿里 mysql内核_阿里云数据库内核组讲解MySQL中的两种临时表
  11. 怎样规划你毕业以后的人生
  12. plc和pc串口通讯接线_电脑和PLC连接不上我用的是USB转串口的连接线
  13. 音乐自动播放html代码大全,网页HTML音乐播放器代码大全
  14. ssr提示服务器名无效_免费领取腾讯云服务器附带新手配置步骤(搭建网站)
  15. 解决window10系统电脑插入耳机之后没有声音的问题
  16. python exe文件反编译_[原创]python exe文件解包方法总结
  17. 解决Rabbitmq连接超时问题
  18. vs写c语言快捷键,vs快捷键
  19. JavaMail 邮件附件名乱码问题
  20. 区块链数字签名、验签,以及椭圆曲线算法JS库—elliptic的使用

热门文章

  1. 基础集合论 第二章 9 族
  2. android加载图片+背景,Android开发中ImageLoder加载网络图片时将图片设置为ImageView背景的方法...
  3. pause容器作用_Kubernetes pod里一个特殊的容器:pause-amd64
  4. 使用PacketSifter从pcap中筛选有价值的信息
  5. 使用SniperPhish进行电子邮件钓鱼
  6. Websocket 从header读取数据
  7. 2016-05-25 margin-right jsp获取页面流变量 文字颜色
  8. java多线程工具类_Java多线程同步工具类之Semaphore
  9. iOS 推送功能打包后获取不到deviceToken
  10. element ui 1.4 升级到 2.0.11