我是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不是一个很大的空间接受者吗?
答案 0 :(得分:2)
您正在尝试创建接口的实例,而您应该实例化实现它的类。像这样:
public Queue<Integer> intQueue = new ArrayBlockingQueue<Integer>(10);
答案 1 :(得分:1)
只需使用add
和offer
代替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
包中的队列。
编译器可以推断构造函数的类型参数,因此您可以使用“菱形运算符”<>
来减少混乱。