什么是在Java中实现入队的更有效方法

时间:2013-11-16 17:03:13

标签: java performance arraylist queue

所以我在java中有这个简单的代码。它将队列末尾(添加)和元素排入队列(由ArrayList实现),而不更改原始队列。代码:

public class MyQueue<T>{
private List<T> body;

// some constructors and helper functions.

//copy constructor
public Queue(List<T> list){
this.body = list;
}

//this is the function
public MyQueue<T> enqueue(T obj){
List<T> temp = new ArrayList<T>(body);
temp.add(obj);
return new Queue<T>(temp);
}

整个想法是让你更快更有效地入队,而且,正如你所注意到的那样,不改变原始队列的价值。

更新为了完成这个想法。

1-这是一个如此大学的作业,提供的骨架是不可更改的,任务是让函数入队更快(我确实知道我复制了两次,这是缓慢的部分)。

2-对于辅助函数,它们很简单:

public T peek(){
if(body.isEmpty()){
   thrown new NoSuchElementException();
}
return body.get(0);
}

public int size(){
return body.size();
}

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:1)

队列是一种基本的数据结构,很难让它比使用它的专家更好。最简单,最快速的通用实现可能是ArrayDeque,而且几乎无法改进。

你正在做的事情充其量是奇怪的:

  • 您可以复制整个内容,而不是追加元素。为什么?
  • 您将新元素插入最高索引,为什么?这样你的轮询(dequeue,remove等等)必须删除元素0处的索引,这对ArrayList来说很慢。

实际上,我不知道您的poll可能会是什么样子。在任何情况下,你的enqueue都不会像我这样的方法那样做。

答案 1 :(得分:0)

使用LinkedList而不是ArrayList。您不需要队列中的索引访问,但您需要快速入队/出队。如果您需要索引访问。它根本不是一个队列。并且只需使用add()方法,不要每次都创建一个全新的队列。你的enqueue()方法应该返回'this'或void。并且不允许调用者提供列表:创建自己的列表。