[英]Java Queue Implementation
我是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不是一个很大的空间接受者吗?
您正在尝试创建接口的实例,而您应该实例化实现它的类。 像这样:
public Queue<Integer> intQueue = new ArrayBlockingQueue<Integer>(10);
只需使用add
and offer
而不是enqueue
。
尺寸为900的阵列很小,不值得担心。 使用尽可能多的元素来允许队列保留。
以下是我在单线程应用程序中作为Queue
成员推荐的内容:
private final Queue<String> someLogicalName = new ArrayDeque<>();
让我们打破这个。
private
修饰符意味着只有出现此声明的类(或类的实例)才能使用您的队列。
final
修饰符意味着无法重新分配成员。 如果您从未计划更改该值,请使用final
修饰符明确表示该假设,并且编译器会在您意外违反您的假设时告诉您。 并且,如果多个线程将访问变量,那么使其成为final
是获得所有线程将看到其指定值而不是null
的保证的方法之一。
我将变量声明为Queue
,因为那是我希望代码工作的接口。 我没有将它声明为实现类; 这可能会阻止我在我的需求发生变化时更改实现类型。
名称qu
不告诉我们任何事情。 如果你有几个队列怎么办? 你会把它们命名为“qu”,“qu2”,“qu3”吗? 这很快就会让人感到困惑。 选择描述信息在变量中的角色的逻辑名称,而不是其类型。
如何找到Queue
的实现类? 看看文档。 请参阅标题为“所有已知实现类?”的部分。 其中大多数是具体类型,它们满足Queue
接口。 您可以阅读每个文档的文档,看看它们之间的区别,并选择适合您使用的文档。 虽然Queue
具有比大多数集合类型更多的实现,但它们遵循命名模式,可以轻松缩小您的需求范围。 我选择了一个简单的单线程队列,但如果您正在使用线程池,则可能需要java.util.concurrent
包中的队列。
编译器可以推断构造函数的类型参数,因此可以使用“菱形运算符” <>
来减少混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.