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)