当前位置:首页 » 编程语言 » java先进先出

java先进先出

发布时间: 2022-07-06 11:40:04

‘壹’ java list 中数据存储的顺序是 先进先出 还是 先进后出 如:

list 是个接口 具体的顺序是看你实现的是LinkedList 还是 ArrayList 的还要看你怎么添加数据的

LinkedList 是链表 就是一个接着一个

ArrayList 则不一定了

比如

List lst = new ArrayListt();
lst.add("add");
lst.add("art");
lst.add("uio");
lst.add(1,"ert");
for (Object s : lst) {
System.out.println(s);
}

结果就是
add
ert

art
uio

‘贰’ JAVA中哪个能同时满足 先进先出(增减操作非常频繁)和同步安全的容器集合并在性能上不至于太差

public class ConcurrentLinkedQueue<E>
extends AbstractQueue<E>
implements Queue<E>, Serializable

一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。

此实现采用了有效的“无等待 (wait-free)”算法,该算法基于 Maged M. Michael 和 Michael L. Scott 合着的 Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms 中描述的算法。

需要小心的是,与大多数 collection 不同,size 方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前元素的数量需要遍历这些元素。

此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。

内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedQueue 之前的线程中的操作 happen-before 随后通过另一线程从 ConcurrentLinkedQueue 访问或移除该元素的操作。

注意:ConcurrentLinkedQueue的size()是要遍历一遍集合的!因此,若不能满足你,可以基于 LinkedList(先进先出),自己加上同步,要性能控制住,需要尽可能小力度加同步 。

‘叁’ java 用什么实现 FIFO队列

java使用数据结构来实现FIFO先进先出的队列,实例如下:

/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
packagelinkedlisttest;

importjava.util.ArrayList;
importjava.util.Deque;
importjava.util.LinkedList;
importjava.util.List;

/**
*
*@authorVicky.H
*@[email protected]
*/
publicclassFIFOTest{

/**
*@
*/
publicstaticvoidmain(String[]args){
FIFO<A>fifo=newFIFOImpl<A>(5);
for(inti=0;i<20;i++){
Aa=newA("A:"+i);
Ahead=fifo.addLastSafe(a);
System.out.println(i+" head:"+head+" size:"+fifo.size());
}

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

System.out.println("弹出数据");
List<A>polls=fifo.setMaxSize(3);
for(Aa:polls){
System.out.println(" head:"+a);
}

System.out.println("剩余数据");
for(Aa:fifo){
System.out.println(" head:"+a);
}
System.out.println(fifo.size());
}
}

interfaceFIFO<T>extendsList<T>,Deque<T>,Cloneable,java.io.Serializable{

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

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

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

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

}

classFIFOImpl<T>extendsLinkedList<T>implementsFIFO<T>{

privateintmaxSize=Integer.MAX_VALUE;
privatefinalObjectsynObj=newObject();

publicFIFOImpl(){
super();
}

publicFIFOImpl(intmaxSize){
super();
this.maxSize=maxSize;
}

@Override
publicTaddLastSafe(TaddLast){
synchronized(synObj){
Thead=null;
while(size()>=maxSize){
head=poll();
}
addLast(addLast);
returnhead;
}
}

@Override
publicTpollSafe(){
synchronized(synObj){
returnpoll();
}
}

@Override
publicList<T>setMaxSize(intmaxSize){
List<T>list=null;
if(maxSize<this.maxSize){
list=newArrayList<T>();
synchronized(synObj){
while(size()>maxSize){
list.add(poll());
}
}
}
this.maxSize=maxSize;
returnlist;
}

@Override
publicintgetMaxSize(){
returnthis.maxSize;
}
}

classA{

privateStringname;

publicA(){
}

publicA(Stringname){
this.name=name;
}

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
this.name=name;
}

@Override
publicStringtoString(){
return"A{"+"name="+name+'}';
}
}

‘肆’ JAVA中队列和栈的区别

队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;

栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。

区别如下:

一、规则不同

1. 队列:先进先出(First In First Out)FIFO

2. 栈:先进后出(First In Last Out )FILO

二、对插入和删除操作的限定不同

1. 队列:只能在表的一端进行插入,并在表的另一端进行删除;

2. 栈:只能在表的一端插入和删除。

三、遍历数据速度不同

1.
队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快;

2.
栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。

‘伍’ 如何用java实现fifo页面置换算法

[fifo.rar] - 操作系统中内存页面的先进先出的替换算法fifo
[先进先出页面算法程序.rar] - 分别实现最佳置换算法(optimal)、先进先出(fifo)页面置换算法和最近最久未使用(LRU)置换算法,并给出各算法缺页次数和缺页率。
[0022.rar] - 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断
[Change.rar] - 用java实现操作系统的页面置换 其中包括 最佳置换算法(Optimal)、先进先出算法(First-in, First-out) 、最近最久不用的页面置换算法(LeastRecently Used Replacement)三种算法的实现
[M_Management.rar] - 操作系统中内存管理页面置换算法的模拟程序,采用的是LRU置换算法
[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包加载到44b0x 的ADS1.2工程文件的说明书。说名了加载过程的细节和如何处理演示程序和代码。演示代码已经上传,大家可以搜索
[.rar] - java操作系统页面置换算法: (1)进先出的算法(fifo) (2)最近最少使用的算法(LRU) (3)最佳淘汰算法(OPT) (4)最少访问页面算法(LFU) (注:由本人改成改进型Clock算法) (5)最近最不经常使用算法(NUR)

‘陆’ Java使用LinkedList来模拟一个队列(先进先出的特性)

importjava.util.LinkedList;

publicclassDemo01{
privateLinkedList<Object>linkedList;

publicDemo01(){
linkedList=newLinkedList<Object>();
}

publicvoidput(Objectobject){
linkedList.add(object);
}

publicObjectget(){
Objectobject=null;
if(linkedList.size()!=0){
object=linkedList.get(0);
linkedList.remove(0);
}
returnobject;
}

publicbooleanisEmpty(){
if(linkedList.size()!=0){
returntrue;
}else{
returnfalse;
}
}

publicstaticvoidmain(String[]args){
Demo01demo01=newDemo01();
demo01.put("1");
demo01.put("2");
System.out.println(demo01.get());
System.out.println(demo01.get());
System.out.println(demo01.isEmpty());
}
}

结果:

1

2

false

‘柒’ 帮我读读Java写的先进先出进程调度,谢谢大神

先进先出思路就是把数据放进一个有序集合,每次放数据是在集合尾部,每次取数据是在集合头部,这样就可以做到先进先出的调度。

‘捌’ 用js(java script)编写最佳置换算法或者先进先出置换算法

要说编程,容易也容易,难也难。关键在于你怎么学,学习编程,关键是要有持之以恒坚持下去的心态,不能坚持什么也做不好。除此之外的还要有合适的学习技巧。两者相结合,编程没有什么难得。下面诚筑说小编分享一下java学习体会,希望能帮助到大家。

2

学习java的体会一

首先,先放开JAVA,学习HTML技术,其中包括HTML5,CSS3,JavaScript ES6,当然,还包括各种前端框架,鉴于目前前端水太深,不建议深入学习一些架构型的框架,比如React,Angular这些,暂时只需要掌握jQuery就行了。这些前端技术会帮你构建出管理系统的界面,毕竟你的程序不能跑在命令行终端里是不是。

然后开始学JAVA,J2SE基础部分,掌握JAVA的面向对象思想,众多集合类的使用。这里,本着实用主义的态度,建议题主暂时先不要考虑JAVA中的多线程、反射等技术,在了解基本语法和集合类的数据结构后,可以立刻转向“了解”JDBC和数据库

3

学习java的体会二

一些Java基础,比如各种容器的使用,泛型编程,多线程模型,面向对象的特性,反射,构建系统,单元测试框架等等。如果是这些,那我认为题主千万不要“搁置”,因为这些内容是学习Java必须要掌握的,基本上每一个项目都会直接/间接用到。如果这时搁置起来,就相当于半途而废,想做出一个满足功能需求的Java项目都会有困难。

如果已经掌握了以上知识,想看一些高级点的知识:各种垃圾回收算法,并发库,一套又一套的“企业级”框架或者J2EE容器,又或者是底层的网络编程模型。那么我认为题主学Java已经有了阶段性的成果,可以将这些暂时搁置,一时兴起时翻一翻,做个Demo,或者遇到实际需求时再学。

4

学习java的体会三

直到今天,我还是会经常专研一个技术点,比如js的一个矩阵算法,实现色彩的霓虹灯变换;亦或是,Java多线程内存自动优化技术。我会去专研,而且总会研究出比我目前技术水平还高一点点的技术,这样我才能不断的拔高,而且出类拔萃,这是一般程序员没有做到的,当你做到了,你就更牛了。

如果仅仅学了些皮毛,高手写的程序你是望尘莫及的。在学习的过程中,书籍永远是知识最好的载体,很多优秀的程序员大师精心编撰的编程书籍,富含的不仅仅是一些知识,更多的是他们所传授的思想,通过看书,专研书籍中的内容,会让你变得更加聪明,写的程序也更加的精炼。

5

学习java的体会四

了解JAVA的原理,才有可能真正体会JAVA的一切,学习任何事情,只要能掌握原理,就会比较顺利。学习JAVA语言很简单,毕竟JAVA语言也只包含五十多个关键词(keyword)与几十个算符(operator),再加上JAVA语法(syntax)也很简单,所以一般人可以很快就学会JAVA语言。

学会JAVA语言之后,还需要学会一些API才能写出有用的程序。JAVA的API非常多,必须规划好一个学习路径,才不会在浩瀚的API大海中迷失。必备的API包括了:IO、New IO、Collection Framework、Network、RMI、JAXP等。

‘玖’ 如何用Java和Redis设计一个高效的先入先出的队列

分析:
redis的list底层是多个ziplist结构组成的“双向”链表。中间部分还压缩了一下。
最外层是由两个哈希表构成的dict。
哈希表的get(key)时间复杂度为O(1),而且这个O(1)理论上不会因为所占内存的大小和元素数目所改变。list的出队列和入队操作也都是O(1)。
Java的队列时间复杂度也应为O(1)。

可不可以直接用redis的list做先进先出?

情况1,数据数量不多,可以用
情况2,数据量多,但存的数据是激活码这样简单值一类,可以用。
情况3,list存的是要获取数据的索引,大量数据的值已经存在redis的KV结构中。
这时候,如果数据每次获取下一个数据都要执行redis的hash查找(O(1))然后redis的list从头或者末尾出一个。经过网络IO返回,Java程序在用出来的key去请求redis去get(key) (O(1))。这里是两次网络IO或者进程间的IO。
这时候,可以不用redis的list存索引而只是用redis大的KV哈希结构存键值。用①Java的队列先进先出获取下一个key或者②使用预先规定好的键生成的规则,让键是有规则有顺序的,比如自增ID,然后每次获取都是ID++,而直接从redis.get(ID.next());来获取值。

最后一种就是最高效的办法,为了特殊场景的高效出队列而设计。但是如果只是一般的数据量,使用redis的list也未尝不可。

‘拾’ java 排队执行怎么实现

用队列即可实现先进先出,对应的实现:LinkedList,在分布式环境上,可以用消息队列,如:rocketmq、kafka、activemq

热点内容
电脑上哪个游戏可以移植到安卓上 发布:2025-03-14 00:10:32 浏览:471
tcl编译器 发布:2025-03-13 23:52:59 浏览:321
linuxnamed 发布:2025-03-13 23:45:29 浏览:361
阿里云30元服务器 发布:2025-03-13 23:21:25 浏览:350
pythonstatvfs 发布:2025-03-13 23:14:55 浏览:953
火车上有密码多少 发布:2025-03-13 23:14:10 浏览:865
解压火柴 发布:2025-03-13 22:46:39 浏览:336
开机密码在哪里存着 发布:2025-03-13 22:27:22 浏览:952
光流场算法 发布:2025-03-13 21:35:51 浏览:896
免编程轴控 发布:2025-03-13 21:19:24 浏览:781