java先进先出
‘壹’ 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