Java中HashMap和TreeMap的区别
时间:2020-02-23 14:34:05 来源:igfitidea点击:
在本文中,我将解释javahashmap和javatreemap之间的区别
虽然两者都实现了Map接口并提供了基本相同的功能,但是HashMap和TreeMap有不同的实现,最重要的区别是通过条目进行迭代的顺序。
HashMap和TreeMap的主要区别
TreeMap是SortedMap的一个例子,它由红黑树实现,这意味着键的顺序被排序。当迭代这些键时,可以依赖于它们将按顺序排列的事实。键的顺序由任一元素的
compareTo()
方法或者外部提供的比较器。
HashMap另一方面,没有这样的保证。它是通过哈希表实现的。因此,当迭代HashMap的键时,不能确定它们的顺序。
请看以下示例:
package theitroad.local; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class HashMapVsTreeMapExample { public static void main(String[] args) { Map<Integer, String> hMap = new HashMap<Integer, String>(); hMap.put(5, "A"); hMap.put(11, "C"); hMap.put(4, "Z"); hMap.put(77, "Y"); hMap.put(9, "P"); hMap.put(66, "Q"); hMap.put(0, "R"); Map<Integer, String> tMap = new TreeMap<Integer, String>(); tMap.put(5, "A"); tMap.put(11, "C"); tMap.put(4, "Z"); tMap.put(77, "Y"); tMap.put(9, "P"); tMap.put(66, "Q"); tMap.put(0, "R"); System.out.println("HashMap iteration order ======="); for (Map.Entry<Integer, String> entry : hMap.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } System.out.println("\nTreeMap iteration order ======="); for (Map.Entry<Integer, String> entry : tMap.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } } }
现在看看这个程序的输出:
HashMap iteration order ======= 0 = R 66 = Q 4 = Z 5 = A 9 = P 11 = C 77 = Y TreeMap iteration order ======= 0 = R 4 = Z 5 = A 9 = P 11 = C 66 = Q 77 = Y
我们可以看到,在“随机”的映射中,我们可以看到“随机”的条目。另一方面,TreeMap迭代按自然顺序返回条目。
实现复杂度差异
由于HashMap实现的复杂性是O(1),所以通常可以认为HashMap效率更高,所以只要不关心键的顺序,就可以使用它。另一方面,TreeMap中get、put和remove操作的复杂性是O(log(n))
允许的键值差异
另一个重要的区别是,HashMap null值允许用于键和值,而TreeMap只允许null用于它的值。
同步(无差异)
注意,这两个实现都不同步,这意味着在这些映射上操作不是线程安全的。如果需要线程安全映射,我们可能需要从java.util.concurrent软件包。这是Map的线程安全实现,它提供了比
Collections.synchronizedMap(Map<K,V> m)