package com.corejava.collec;
import java.util.AbstractQueue;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Queue;
/**
* @author teddy.lu 06-07-18
*/
public class CircularArrayQueueTest {
/**
* @param args
*/
public static void main(String[] args) {
Queue<String> q = new CircularArrayQueue<String>(10);
q.add("Amy");
q.add("Bob");
q.add("Carl");
q.add("Deedee");
q.add("Emile");
q.add("Fifi");
for (Iterator iter = q.iterator(); iter.hasNext();) {
String element = (String) iter.next();
System.out.println(element);
}
System.out.println("size :" + q.size());
}
}
class CircularArrayQueue<E> extends AbstractQueue<E> {
private E[] elements;
private int head;
private int tail;
private int count;
private int modcount;
/**
* constructs an empty queue
*
* @param capacity
*/
public CircularArrayQueue(int capacity) {
super();
elements = (E[]) new Object[capacity];
this.modcount = 0;
this.count = 0;
this.head = 0;
this.tail = 0;
}
@Override
public Iterator<E> iterator() {
return new QueueIterator();
}
@Override
public int size() {
return count;
}
public boolean offer(E o) {
assert elements != null;
// there are still remain space
if (count < elements.length) {
elements[tail] = o;
tail = (tail++) % elements.length;
count++;
modcount++;
return true;
} else {
return false;
}
}
public E peek() {
if (count == 0) {
return null;
} else
return elements[head];
}
public E poll() {
// first judge the elements if empty
if (count == 0) {
return null;
} else {
E e = elements[head];
head = (head + 1) % elements.length;
count--;
modcount++;
return e;
}
}
public CircularArrayQueue() {
super();
}
private class QueueIterator implements Iterator<E> {
private int offset;
private int modcountAtConstruct;
public QueueIterator() {
System.out.println("modcount is: "+modcount);
modcountAtConstruct = modcount;
}
public boolean hasNext() {
if (modcount != modcountAtConstruct)
throw new ConcurrentModificationException();
return offset < elements.length;
}
public E next() {
if (!hasNext())
throw new NoSuchElementException();
E r = elements[(head + offset) % elements.length];
offset++;
return r;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
今天在看core java 7th中关于collection中的内容,在动手运行上面的程序时,发现只保存了最后一个String,结果审阅代码,发现问题竟然出现在 tail = (tail++) % elements.length; 在此记下,以免以后出现同样的错误。 认为这语句其实可以分解成3句来执行(1) tail%elements.length 得 0,(2) tail= tail+1 得 1,(3)再将1的结果赋给tail得0