當前位置:首頁 » 編程語言 » 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-02-02 09:48:54 瀏覽:433
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:744
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:147
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:240
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726