package com.alibaba.doris.admin.service.common.consistent; /** * 类RingQueue.java的实现描述:环形队列,队列满了队首元素弹出,队尾插入<br/> * 注意:非线程安全 * * @author hongwei.zhaohw 2012-1-19 */ public class RingQueue<T> { private static final int DEFAULT_CAPACITY = 100; private T[] datas; private int head = 0; private int tail = 0; private int size = 0; private int capacity = DEFAULT_CAPACITY; public RingQueue() { this(DEFAULT_CAPACITY); } public RingQueue(int capacity) { this.capacity = capacity; datas = (T[]) new Object[capacity]; } /** * 队尾插入 * * @param data */ public void put(T data) { if (datas[tail] != null) { head++; } datas[tail] = data; tail = ++tail % capacity; if (size++ >= capacity) { size = capacity; } } /** * 从队首取出 * * @return */ public T get() { if (size <= 0) { return null; } T data = datas[head]; datas[head] = null; head = ++head % capacity; size--; return data; } /** * 一次取出所有元素 * * @param copy * @return */ public <T> T[] getAll(T[] copy) { int index = 0; for (int i = 0; i < capacity; i++) { if (datas[i] != null) { copy[index++] = (T) datas[i]; datas[i] = null; } } return copy; } public int getSize() { return size; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < capacity; i++) { sb.append(String.valueOf(datas[i])).append(","); } sb.append("]"); return sb.toString(); } public static void main(String[] args) { RingQueue<String> q = new RingQueue<String>(5); q.put("s1"); q.put("s2"); q.put("s3"); System.out.println(q.tail); System.out.println(q); System.out.println(q.get()); System.out.println(q); q.put("s4"); q.put("s5"); q.put("s6"); q.put("s7"); System.out.println(q); q.get(); System.out.println(q); q.put("s8"); q.put("s9"); q.get(); q.put("s10"); q.put("s11"); q.put("s12"); q.get(); System.out.println(q); String[] sCopy = new String[q.size]; String[] all = q.getAll(sCopy); for (int i = 0; i < all.length; i++) { System.out.print(all[i] + ","); } System.out.println(q); } }