我想在Java中使用PriorityQueue时应该声明为Queue还是PriorityQueue?
Should I declare as Queue or PriorityQueue when I want to use PriorityQueue in Java?
PriorityQueue<Integer> pq = new PriorityQueue<>(); // first
Queue<Integer> pq = new PriorityQueue<>(); // second
我的问题:
哪个更好?我看到很多例子都使用第一个,但我也听说过 program against interface。声明的类型应该尽可能通用。 PriorityQueue 实现 Queue 接口,因此从第二个参数,我们应该使用第二个。
PS:
这个例子与 ArrayList<Integer> list = new ArrayList<>()
vs
List<Integer> list = new ArrayList<>()
,因为我从未见过任何生产代码将第一个用于 ArrayList
,而我们总是使用第二个。但是,我确实看到很多例子使用第一个 PriorityQueue
.
您应该使用一个足够通用的接口来满足您的需求,而不是强加实现细节,但又要足够具体以适合您的具体用例。
如果您需要一些队列而不使用任何优先级功能(例如,您的代码不使用任何优先级知识),则使用 Queue
。这样您就可以在一行中更改实际实现。
如果您的代码使用了优先级功能并依赖它们,那么您绝对应该使用 PriorityQueue
,因为 Queue
过于笼统,在调用优先级方法时会导致错误。
PriorityQueue<Integer> pq = new PriorityQueue<>(); // first
Queue<Integer> pq = new PriorityQueue<>(); // second
我的问题:
哪个更好?我看到很多例子都使用第一个,但我也听说过 program against interface。声明的类型应该尽可能通用。 PriorityQueue 实现 Queue 接口,因此从第二个参数,我们应该使用第二个。
PS:
这个例子与 ArrayList<Integer> list = new ArrayList<>()
vs
List<Integer> list = new ArrayList<>()
,因为我从未见过任何生产代码将第一个用于 ArrayList
,而我们总是使用第二个。但是,我确实看到很多例子使用第一个 PriorityQueue
.
您应该使用一个足够通用的接口来满足您的需求,而不是强加实现细节,但又要足够具体以适合您的具体用例。
如果您需要一些队列而不使用任何优先级功能(例如,您的代码不使用任何优先级知识),则使用 Queue
。这样您就可以在一行中更改实际实现。
如果您的代码使用了优先级功能并依赖它们,那么您绝对应该使用 PriorityQueue
,因为 Queue
过于笼统,在调用优先级方法时会导致错误。