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 的值。data.length内部方法如何enqueue工作?如何正确获取 Event 对象的大小?

4

2 回答 2

2

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

你为什么要它?由于您仅在数组中存储对堆上对象的引用,因此每个数组元素的大小基本上是恒定的。

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

于 2012-04-30T13:43:08.167 回答
1

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

于 2012-04-30T13:46:24.490 回答