【问题标题】:Declaring a Queue/HashSet声明一个队列/HashSet
【发布时间】:2013-09-09 01:13:56
【问题描述】:

我正在学习 HashSet 和队列,但我很难理解为什么 Queue/hashMap/other java.util 预定义的数据结构被声明为:

Set<T> h =  new HashSet<T>();
Queue<T> q = new LinkedList<T>();

我了解&lt;T&gt; 可以是整数/字符串/其他数据类型,这是为了确保我们将相同的数据类型添加到数据结构中。但是,我不明白为什么当它是一个 HashSet 时,我必须将它声明为一个新的 HashMap。我关注this。有没有办法知道必须将 HashSet/Queue/others 声明为仅 HashMap/LinkedList?非常感谢!请告诉我是否必须解释/修改我的问题。

【问题讨论】:

  • 这:HashSet&lt;T&gt; h = new HashMap&lt;T&gt;(); 没有意义,不应该编译。您不能将 Map 分配给 Set,也不能仅使用一个通用参数声明或定义 Map。
  • 对不起,它是 Set= HashSet。我会编辑它
  • 是的,我明白了为什么我不能将地图分配给只有一个参数的集合。谢谢! :)

标签: java hashmap queue


【解决方案1】:

这被称为接口编码而不是实现。如果需要,拥有接口引用可以让您灵活地在以后更改实现。例如今天,您正在使用 HashSet 所以你定义它为:

Set<T> h =  new HashSet<T>();

但如果后来你意识到你需要一个LinkedHashSet,那么只需替换它

Set<T> h =  new LinkedHashSet<T>();

无需更改任何其他代码。这就是为什么这被称为良好的编码实践。

【讨论】:

  • 那么,这完全取决于哈希集是如何/为什么应用程序定义的?
  • 这是一种很好的编码习惯,可以让你灵活处理。
  • 好的,还有一个问题。队列 q = new Queue(); 是什么?那是什么意思?
  • 因为它让我编译它但我不能使用队列函数。
  • 您可以将 LinkedList 分配给 Queue,因为 LinkedList 实现了从 Queue 接口扩展的 DeQueue 接口。您应该能够调用队列接口中所有可用的方法。
【解决方案2】:

这只是遵循“编码到接口而不是实现”的规则。这将为您的程序提供更大的灵活性并允许更轻松的测试。使用接口时隔离和模拟类要容易得多;如果使用接口,则使用工厂创建对象和使用 Guice 或 Spring 等工具进行依赖注入要容易得多。

【讨论】:

  • 知道了,但是如何避免总是将 声明为整数或字符串?有没有办法将其声明为可以更改的变量?
猜你喜欢
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多