整套實現:
創新互聯公司-專業網站定制、快速模板網站建設、高性價比烏蘭察布網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式烏蘭察布網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋烏蘭察布地區。費用合理售后完善,十載實體公司更值得信賴。
class Element{
int id;
String name;
Element(int a,String n){
id=a;name=n;
}
}
class SeqQueue{
int first,last,maxsize;
Element queue[];
SeqQueue(int i){
maxsize=i;
first=last=-1;
queue=new Element[i];
}
public void clear(){//置空
first=last=-1;
}
public boolean isEmpty(){//判空
if(first==-1)return true;
else return false;
}
public Element getFirst(){//取隊列頭元素
if(first==-1)return null;
else return queue[first+1];
}
public boolean isFull(){//判滿
if((last+1)%maxsize==first)return true;
else return false;
}
public boolean enQueue(Element e){//入隊
if(this.isFull())return false;
if(this.isEmpty())
first=last=0;
else
last=(last+1)%maxsize;
queue[last]=e;
return true;
}
public Element deQueue(){//出隊
Element t=queue[first];
if(this.isEmpty())return null;
if(first==last){
queue[first]=null;
this.clear();
return t;
}
queue[first]=null;
first=(first+1)%maxsize;
return t;
}
public int getLength(){//隊列長度
if(last=first)return last-first+1;
else return maxsize-(first-last)+1;
}
public void display(){//打印所有元素
int i,j;
for (i=first,j=0;jthis.getLength();i=(i+1)%maxsize,j++)
System.out.println(queue[i].id);
}
}
數據的情況:
[0] [1] [2] [3] [4]
加入一個:
[0] [1] [2] [3] [4] [5]
取出一個后
[0] [1] [2] [3] [4] [5]
可以看出來,每次取出第一個,第一個元素還是沒變,一直是0
要讓其數據變成 [1] [2] [3] [4] [5] 那么就要自己手動變動數據(就是手動往前移動)
你這個只是進隊 如果隊列滿了 只是會打印溢出,并不會對數組integerQueue有任何的影響,所以當 1 2 3 4 5的時候,進來的6并不會加入隊列里面。如果出隊列你改變的并不是數組,而只是tail,
所以當 隊列是 1 2 3 4 5 的時候,出隊列了,只是讓tail改成3,但是整個數組的長度還是5,所以打印數組的時候還是 1 2 3 4 5
你可以在打印的時候 for(int i=0;iintegerQueue.length;i++)改for(inti=0;i=tail;i++);
分析:
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也未嘗不可。
import java.util.ArrayList;
/**
*
* @author 獄韜
*/
public class SnakeBody {
private int size=0; //隊列的長度
private int cursor=-1; //指針
private ArrayListint[] list=null; //存儲器
public SnakeBody() {
list=new ArrayListint[](); //存儲器
}
//返回底部的數據
public int[] getLast(){
return list.get(list.size()-1);
}
//返回頂部的數據
public int[] getFirst(){
return list.get(0);
}
//壓入數據
public void put(int[] arry){
list.add(arry);
}
//刪除底部數據
public void removeLast(){
list.remove(list.size()-1);
}
//重置
public void reSet(){
list=new ArrayListint[](); //存儲器
}
//刪除頂部數據
public void removeFirst(){
list.remove(0);
}
//返回數據長度
public int size(){
return list.size();
}
public static void main(String[] args) {
SnakeBody data = new SnakeBody();
for(int i=0;i10;i++){
data.put(new int[]{0,i});
}
System.out.println(data.getFirst()[0]+"-------"+data.getFirst()[1]);
System.out.println(data.getLast()[0]+"-------"+data.getLast()[1]);
data.removeLast();
System.out.println(data.getFirst()[0]+"-------"+data.getFirst()[1]);
System.out.println(data.getLast()[0]+"-------"+data.getLast()[1]);
}
}
消息隊列,顧名思義 首先是個隊列。
隊列的操作有入隊和出隊
也就是有一個程序在產生內容然后入隊(生產者)
另一個程序讀取內容,內容出隊(消費者)
這是最最基本的概念。
java中的消息隊列
消息隊列是線程間通訊的手段:
import?java.util.*
public?class?MsgQueue{
private?Vector?queue?=?null;
public?MsgQueue(){
queue?=?new?Vector();
}
public?synchronized?void?send(Object?o)
{
queue.addElement(o);
}
public?synchronized?Object?recv()
{
if(queue.size()==0)
return?null;
Object?o?=?queue.firstElement();
queue.removeElementAt(0);//or?queue[0]?=?null?can?also?work
return?o;
}
}
因為java中是locked by object的所以添加synchronized 就可以用于線程同步鎖定對象
可以作為多線程處理多任務的存放task的隊列。他的client包括封裝好的task類以及thread類
標題名稱:java代碼的出隊和入隊,java隊列代碼
鏈接URL:http://vcdvsql.cn/article8/hedgip.html
成都網站建設公司_創新互聯,為您提供網站排名、品牌網站建設、移動網站建設、企業建站、響應式網站、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯