Java队列实现

时间:2013-07-12 21:21:44

标签: java queue

我是Java新手并尝试使用:

public static ArrayBlockingQueue<String> qu=new ArrayBlockingQueue<>(900);
...
qu.enqueue(MyString);

public static Queue<String> qu=new Queue<>(900);
...
qu.enqueue(MyString);

队列尖叫,声称它只是一个界面。 ArrayBlockingQueue不接受入队。 我觉得我犯了一些基本错误。我的问题是:每次使用它时,我是否必须编写自己的Queue来实现接口,或者是否有就绪函数?如果是的话,我做错了什么? 我的第二个问题是:什么是标准队列大小?根据我阅读的规格,我认为它必须是我可以使用的最大值,但对于小型应用来说,900不是一个很大的空间接受者吗?

3 个答案:

答案 0 :(得分:2)

您正在尝试创建接口的实例,而您应该实例化实现它的类。像这样:

public Queue<Integer> intQueue = new ArrayBlockingQueue<Integer>(10);

答案 1 :(得分:1)

只需使用addoffer代替enqueue

900号阵列很小,不值得担心。使用尽可能多的元素来允许队列保留。

答案 2 :(得分:1)

以下是我在单线程应用程序中推荐的Queue成员:

private final Queue<String> someLogicalName = new ArrayDeque<>();

让我们打破这一点。

private修饰符意味着只有出现此声明的类(或类的实例)才能与您的队列一致。

final修饰符表示无法重新分配成员。如果您从未计划更改该值,请使用final修饰符明确表示该假设,并且编译器会在您意外违反您的假设时告诉您。并且,如果多个线程将访问该变量,则使其final是获得所有线程将看到其指定值的保证的方法之一,而不是null

我将变量声明为Queue,因为那是我希望代码工作的接口。我将其声明为实现类;这可能会阻止我在我的需求发生变化时更改实现类型。

名称qu没有告诉我们任何事情。如果你有几个队列怎么办?你会把它们命名为“qu”,“qu2”,“qu3”吗?这很快就会让人感到困惑。选择描述信息在变量中的角色的逻辑名称,而不是其类型。

如何找到Queue的实施类?查看the documentation.请参阅标题为“所有已知实现类?”的部分。其中大多数是具体类型,它们满足Queue接口。您可以阅读每个文档的文档,看看它们之间的区别,并选择适合您使用的文档。虽然Queue具有比大多数集合类型更多的实现,但它们遵循命名模式,可以轻松缩小您的需求范围。我选择了一个简单的单线程队列,但如果您正在使用线程池,则可能需要java.util.concurrent包中的队列。

编译器可以推断构造函数的类型参数,因此您可以使用“菱形运算符”<>来减少混乱。