2012-04-30 112 views
0

我以下队列类:队列长度

class Queue 
{ 

    private Object[] data; 
    private int numOfElements; 
    private int head; 
    private int tail; 


    Queue(int size) 
    { 
     if (size <= 0) 
      throw new IllegalArgumentException("Size must be greater or equals 0."); 

     data = new Object[size]; 
     head = 0; 
     tail = 0; 
     numOfElements = 0; 
    } 

    void enqueue(Object obj) 
    { 
     data[tail] = obj; 
     tail = (tail + 1) % data.length; 

     if (numOfElements < data.length) 
      numOfElements++; 
    } 

    Object dequeue() 
    { 
     if (numOfElements == 0) 
      throw new EmptyQueueException(); 

     Object dequeuedObject = data[head]; 
     data[head] = null; 
     head = (head + 1) % data.length; 

     numOfElements--; 

     return dequeuedObject; 
    } 

我称这样的方法排队:test_queue.enqueue(new Event(arg1, arg2));

Event对象包含被设置为Arg1的值和两个整数ARG2。方法enqueue中的data.length如何工作? 它如何正确获取Event对象的大小?

+3

'data'只是一个数组(长度),Event的大小是无关紧要的,那么究竟是什么意思? – harold

+0

在这里寻找有关'长度'字段的解释:http://stackoverflow.com/questions/5950155/java-array-length – maksimov

回答

2

data.length返回您的元素数data,这是您的数组(实例字段)。您可能正在寻找类似于C的sizeof,但据我所知Java不提供它。

为什么你想要它?由于您只将引用存储到数组堆中的对象,因此每个数组元素的大小基本上是不变的。

顺便说一句,你有没有想过使用链表或内置队列实现(Queue<E>)而不是数组?

+0

好的,thx的解释。我无法使用内置的队列实现,因为我没有可用的接口(Mobile Java应用程序) – arge

+0

不客气。此示例实现也可能对您有所帮助:http://www.java2s.com/Code/Java/Collections-Data-Structure/SimpleQueueFIFObasedonLinkedList.htm –

1

data.length将刚刚返回静态数组数据的大小,所以在这种情况下,您传递给队列构造函数的大小。至于enqueue方法,它不需要Event元素的大小,因为数据数组本身不存储元素,而是引用元素,并且引用的大小是固定的,无论事件是否为对象字段(您提到的两个整数)实际上已被设置。