Java 爪哇:地图动物园,选择什么
我对Java世界相当陌生(因为我是用C/C++编写primary)。我正在应用程序中使用地图。 因为Java 爪哇:地图动物园,选择什么,java,map,hashmap,hashtable,linkedhashmap,Java,Map,Hashmap,Hashtable,Linkedhashmap,我对Java世界相当陌生(因为我是用C/C++编写primary)。我正在应用程序中使用地图。 因为java.util.Map是抽象的,所以我需要实例化它的实现。通常我会使用HashMap如下: Map<String, MyClass> x = new HashMap<>(); Map x=newhashmap(); 但是在java文档中,我发现了许多其他的实现,比如TreeMap,LinkedHashMap,HashTable,等等。我想知道我是否可以继续盲目地使用
java.util.Map
是抽象的,所以我需要实例化它的实现。通常我会使用HashMap
如下:
Map<String, MyClass> x = new HashMap<>();
Map x=newhashmap();
但是在java文档中,我发现了许多其他的实现,比如TreeMap
,LinkedHashMap
,HashTable
,等等。我想知道我是否可以继续盲目地使用HashMap
,或者这些Map
实现之间有任何重要的差异
要知道的要点的简要列表就可以了。
谢谢。- 不要为哈希表烦恼,它是Java1.0的遗物李>
是通用默认值,因为O(1)查找和依赖于HashMap
和equals
,保证为所有Java对象实现李>hashCode
为您提供了对映射项进行排序的迭代(还有更多内容请参见TreeMap
),但需要比较策略,插入和查找–O(logN)–比NavigableMap
慢李>HashMap
在迭代条目时保留插入/访问顺序LinkedHashMap
SortedMap
实现提供了一些很棒的功能,比如headMap
和tailMap
NavigableMap
实现为采用排序键的操作提供了更多性能优异的功能
此外还有
java.util.concurrent
map实现,如ConcurrentHashMap
,它们提供了出色的并发性能和原子get/put操作。当然,每个映射之间都有重要的区别。这完全取决于你想做什么。如果您回忆起一个HashMap
,当您有一个糟糕的散列函数时,它就变得非常无用(请参阅低效)。LinkedHashMap
是一个由双链接列表支持的HashMap
,因此您可以对其进行迭代。当然,你会吃掉与链表相关的开销TreeMap
将元素保持有序,因此您将消耗这些开销<代码>哈希表是一个同步的集合,通常是避免的。
几乎一直使用它。请注意,您的对象需要正确实现HashMap
和equals
方法。不保存插入顺序hashCode
永远不要使用它HashTable
与LinkedHashMap
相同,但保存插入顺序。巨大的开销HashMap
支持自然排序。但是插入在O(logn)中起作用TreeMap
- 是的线程安全版本,您不应该再使用它。相反,您应该使用线程安全映射的新实现
- 主要用于对密钥进行排序时,它实现了接口。put/get性能为O(logn)
- 如果需要线程安全,则使用
- 要按插入顺序迭代键时使用
HashMap
或ConcurrentHashMap
这些映射实现之间有什么重要区别吗
是的,当选择<代码> map 时,有一些主要的不同要考虑。
- 并发性
您将操作此映射吗 - NULLs
是否接受或拒绝作为键和/或值 - 排序
是否希望地图条目按某种顺序排列,如排序顺序或原始插入顺序?您想要对/接口的支持吗 - 不可修改
是否要冻结地图,拒绝接受或删除条目 - 标识
是否要基于比较键 - 效率
当您的钥匙是一把钥匙时,您想利用非常快的性能和非常少的内存吗 - 文字
是否希望在一行代码中方便地声明和填充映射 - 传统
您想避免使用现代地图之前创建的地图吗
Map
实现的每个特性
你查过javadoc上的那些类了吗?那么,有一家叫做谷歌的公司……我不得不投反对票,就为了这条评论
有太多的东西要看。我还是会读的,但现在我需要一个快速的答案,比如一个简短的差异列表
@Isaac-sure。如果是复制品,那是我的错。感知:官方文件是所有使用该语言的人的必读读物。但再一次,我不是Java程序员,我只需要重写一小段代码。而且要快。我不想盲目地做这件事,但我没有足够的时间去阅读和(更重要的是)理解我在官方文件中读到的内容。“如果这让你伤心,我很抱歉。”maverik,请注意,我的评论是在你解释你的这种情况之前写的。从最初的外观来看,似乎你太懒了,不想做一些研究。显然,没有冒犯的意思。谢谢关于TreeMap的其他事情,它实现了SortedMap谢谢你和所有其他人。这就是我要寻找的。HashMap
查找不是O(1)
-这在很大程度上取决于哈希函数,在最坏的情况下是O(n)
。请参阅get
-@SpaceTrucker的源代码中的for循环。它还具有一个应用于对象自身的hashCode
的重新灰化函数,这在很大程度上缓解了这些问题。@MarkoTopolnik它并没有改变复杂性不是