文档章节

Java简单实现固定长度队列

Mstart
 Mstart
发布于 2015/10/17 10:13
字数 363
阅读 24
收藏 0
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package linkedlisttest;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author MStart
 * @email m_start@163.com
 */
public class FIFOTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        FIFO<A> fifo = new FIFOImpl<A>(5);
        for (int i = 0; i < 20; i++) {
            A a = new A("A:" + i);
            A head = fifo.addLastSafe(a);
            System.out.println(i + "\thead:" + head + "\tsize:" + fifo.size());
        }

        System.out.println("---------------");

        System.out.println("弹出数据");
        List<A> polls = fifo.setMaxSize(3);
        for (A a : polls) {
            System.out.println("\thead:" + a);
        }
        
        System.out.println("剩余数据");
        for (A a : fifo) {
            System.out.println("\thead:" + a);
        }
        System.out.println(fifo.size());
    }
}

interface FIFO<T> extends List<T>, Deque<T>, Cloneable, java.io.Serializable {

    /**
     * 向最后添加一个新的,如果长度超过允许的最大值,则弹出一个 *
     */
    T addLastSafe(T addLast);

    /**
     * 弹出head,如果Size = 0返回null。而不同于pop抛出异常
     * @return 
     */
    T pollSafe();

    /**
     * 获得最大保存
     *
     * @return
     */
    int getMaxSize();

    /**
     * 设置最大存储范围
     *
     * @return 返回的是,因为改变了队列大小,导致弹出的head
     */
    List<T> setMaxSize(int maxSize);

}

class FIFOImpl<T> extends LinkedList<T> implements FIFO<T> {

    private int maxSize = Integer.MAX_VALUE;
    private final Object synObj = new Object();

    public FIFOImpl() {
        super();
    }

    public FIFOImpl(int maxSize) {
        super();
        this.maxSize = maxSize;
    }

    @Override
    public T addLastSafe(T addLast) {
        synchronized (synObj) {
            T head = null;
            while (size() >= maxSize) {
                head = poll();
            }
            addLast(addLast);
            return head;
        }
    }

    @Override
    public T pollSafe() {
        synchronized (synObj) {
            return poll();
        }
    }

    @Override
    public List<T> setMaxSize(int maxSize) {
        List<T> list = null;
        if (maxSize < this.maxSize) {
            list = new ArrayList<T>();
            synchronized (synObj) {
                while (size() > maxSize) {
                    list.add(poll());
                }
            }
        }
        this.maxSize = maxSize;
        return list;
    }

    @Override
    public int getMaxSize() {
        return this.maxSize;
    }
}

class A {

    private String name;

    public A() {
    }

    public A(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "A{" + "name=" + name + '}';
    }
}


本文转载自:

共有 人打赏支持
Mstart
粉丝 9
博文 60
码字总数 17132
作品 0
南通
程序员
JAVA 持有对象——容器初探

引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》 了解容器前,先提出一个问题,ArrayList和LinkedList谁的处理速度更快呢? ...

jiangmitiao
2015/08/01
0
2
慎用Java 自带两种线程池!

Java5相比之前的Java版本,在并发编程上,有了非常大的提高,加了很多类,提供了很多可用于并发编程的工具包和工具类。尤其为人们所称道的,就是Java自带的线程池。 Java5线程池的介绍文章,...

webas
2013/04/26
0
4
【死磕Java并发】—– 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑...

chenssy
07/22
0
0
JDK容器学习之Queue: ArrayDeque

数组双端队列 双端队列,表示可以添加元素到(或删除,获取)队列头也可以添加元素到(或删除,获取)队列尾 1. 底层数据结构 类中定义成员变量,一个数组和两个int 数据结构比较清晰,就是一...

小灰灰Blog
2017/10/22
0
0
Android ThreadLocal+PriorityQueue构建多线程队列

一、消息队列 Android中使用了很多消息队列,如Intent,Handler,BroadcastReceiver等。使用消息队列的目的是防止线程阻塞并且将不能及时执行的任务缓存起来,从而提高系统的运行效率。 为了使...

IamOkay
2014/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

同样是工作3年程序员,为什么别人每月25K你却只有15K?

你有没有静下心来思考过:同样是做了x年Java开发,为什么你的技术比别人差很多?为什么别人每月26K你却只有15K? 其实技术水平的高低和个人智商关系不大(毕竟能做Java编程开发大家都不会差)...

Java填坑之路
3分钟前
0
0
跨域问题:解决跨域的三种方案

当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题,本篇简单介绍解决跨域的三种方案,部分代码截图如下,仅供参考: 方式一:使用ajax的jsonp 前端代码 服务器代码 使用该方...

rechardchensir
3分钟前
0
0
linux学习-1012

8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件 扩展 bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719 简易审计系统: http://www.68idc.cn/help/server/...

wxy丶
4分钟前
0
0
springboot dubbo 在程序初始化完成前 使用回声测试对服务依赖检测

<dubbo:consumer timeout="10000" check="false" /><dubbo:service delay="-1" /> @Component@Order(2)public class PrkServiceInit implements ApplicationListener {private Logge......

林伟琨
6分钟前
0
0
“网红架构师”解决你的Ceph 运维难题

Q1. 环境预准备 绝大多数MON创建的失败都是由于防火墙没有关导致的,亦或是SeLinux没关闭导致的。一定一定一定要关闭每个每个每个节点的防火墙(执行一次就好,没安装报错就忽视): CentOS s...

编程SHA
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部