Car*_*zer 0 java data-structures
因为,硬件变得非常便宜并且现在拥有非常大的内存.为什么我们不能在所有场景中使用像HashMap这样的通用DataStructure呢?如果没有,是否有一个简短的指导方针,以了解在哪种情况下使用哪个DataStructure?
(编辑:这个答案假设您在存储key -> value映射的上下文中提出要求.如果您的数据不能自然地表示映射,例如字符串列表,那么任何类型的Map表示方式都很差,无论是性能和混淆任何看你的代码的人.)
一般来说,你可以.如果您正在使用具有不可变键的映射hashCode()(具有适当的实现)(例如String,任何自动框原语),那么HashMap通常是完全可接受的.
但是,存在不同的数据结构是有原因的 - 它们都提供不同的性能(偶尔也是正确性)语义,所以在某些情况下你可能希望选择其他的.
例如,如果您希望在迭代期间(基于键)以特定顺序访问您的映射条目,则可以使用a TreeMap.如果希望迭代顺序基于它们的插入顺序,请使用a LinkedHashMap.如果你想在简单的并发访问(使用put-if-absent语义)下获得良好的性能,请使用a ConcurrentHashMap.如果你的密钥是枚举,那么一个EnumMap是最有效的实现.如果您希望将密钥存储为弱引用,请使用WeakHashMap.如果要根据所使用的确切对象执行查找(使其对可变键安全),请使用IdentityHashMap.
更不用说如果你知道(但无法改变)你的密钥有一个执行不良的hashCode()方法,特别是如果它与equals不一致,那么HashMap无论如何都可能是一个糟糕的选择.
还有许多其他可能的功能,您可能希望您的数据结构具有无法覆盖的功能,包括(但不限于):
get()对没有存在的密钥执行a 时的延迟初始化等等.如果您自己的域对象具有特定Map实现可以利用的某些属性以获得更快/更清晰/增强的性能(当然,通用库实现永远不会这样做),这尤其可能.
解决"硬件便宜"的说法 - 这是事实,但程序员的时间和用户时间却不是.在某些情况下,应用程序的关键循环可能涉及大量的映射查找,因此加速这些查找将对性能产生显着影响.当然,通常情况并非如此,但如果是这样的话,为具体情况选择性能更好的地图(想到的一个简单例子就是EnumMap在适当的地方使用)会产生性能提升 - 这可能非常重要.
或者,一些地图实现只是使周围的代码更容易编写,更容易理解,并且不太可能存在错误.这里的一个例子可能是懒惰初始化地图(例如Google Collections的ComputingMap).虽然您可以在标准周围编写一些带有lazy-init语义的代码HashMap,但是通过在map实现本身中包含所有这些逻辑,可以更容易地测试正确性 - 并且客户端逻辑更加简单.
如此便宜的硬件/空间并不意味着HashMaps对于一切都是最佳的.事实上,如果有任何反对意见 - 与您可能采用的更具定制的替代方案相比,HashMaps相当节省空间.由于有大量廉价空间可供使用,因此可以将空间与时间进行权衡,存储大量信息以加快查找速度.
请注意,我已将您的问题解释为" 为什么您有时会使用其他类Map?" 而不是" 这等Maps你应该使用什么时候?" 如果是后者,请随意改写或提出另一个更具体地关注此问题的问题.
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |