前几天,有粉丝在直播间问了我这样一个问题,说HashMap和TreeMap有什么区别。今天,我就把我的理解分享给大家。1.两者的区别我们知道,无论是HashMap还是TreeMap,都是通过对象对对象进行索引的Map集合。我们把用于索引的对象称为Key,索引对应的对象称为Value。这就是我们通常所说的键值对。它们的类关系如图:关于HashMap和TreeMap的区别,我从以下四个方面来分析:1)在数据结构上,HashMap是基于哈希表+数组实现的,而TreeMap是基于的红黑树。HashMap的使用需要key对象明确定义hashCode()和equals()这两个方法,并且为了优化HashMap空间的使用,可以调整初始容量大小和扩容。TreeMap没有大小设置选项,因为红黑树结构始终处于平衡状态。2)在效率上,HashMap比TreeMap有更高的性能。HashMap的时间复杂度为O(1),是通过哈希函数计算出的哈希地址。TreeMap主要是为了保证数据的平衡,时间复杂度为O(log2n)。3)线程安全方面,HashMap和TreeMap都不是线程安全的。多线程并发的情况下推荐使用ConcurrentHashMap;如果想同时保证线程安全和顺序,可以使用Collections.synchronizedMap()方法将其转化为线程安全的集合。4)在应用场景上,HashMap是无序的,而TreeMap是有序的。TreeMap适用于按自然顺序或自定义顺序遍历key的场景。HashMap适用于在Map中插入、删除和定位元素。日常开发建议多使用HashMap,需要排序的时候才使用TreeMap。2.总结最后,我整理了这张表中比较详细的HashMap和TreeMap的区别,有需要的可以到我的个人主页上获取。基本哈希映射树图DefinitionHashMap是基于哈希表Map接口的实现。TreeMap是Map接口的基于树的实现。接口ImplementsHashMap实现Map、Cloneable和Serializable接口。TreeMap实现了NavigableMap、Cloneable和Serializable接口。空键/值HashMap允许单个空键和多个空值。TreeMap不允许空键,但可以有多个空值。同类/异类HashMap允许异类元素,因为它不对键执行排序。由于排序,TreeMap允许同构值作为键。PerformanceHashMap比TreeMap更快,因为它为get()和put()等基本操作提供了O(1)常数时间性能。TreeMap比HashMap慢,因为它为大多数操作(如add()、remove()和contains())提供O(log(n))性能。数据结构HashMap类使用哈希表。TreeMap内部使用的是红黑树,是一种自平衡的二叉查找树。使用Object类的equals()方法比较键的比较方法。Map类的equals()方法覆盖了它。它使用compareTo()方法比较键。FunctionalityHashMap类仅包含基本函数,如get()、put()、KeySet()等。TreeMap类功能丰富,因为它包含以下函数:tailMap()、firstKey()、lastKey()、pollFirstEntry()、轮询最后条目()。元素顺序HashMap不维护任何顺序。元素按自然顺序(升序)排序。当我们不需要排序顺序的键值对时,应该使用HashMap。当我们需要排序(升序)顺序的键值对时,应该使用TreeMap。以上是我对HashMap和TreeMap的理解。
