日常开发中,何时使用HashMap,何时使用TreeMap?
下文笔者讲述HashMap和TreeMap的使用场景说明,如下所示
当对Map运行插入、删除和定位元素这类操作 我们应该选择HashMap 当对Map进行有序key集合遍历 我们应该选择TreeMap
HashMap和TreeMap本质区别
区别1:类定义区别--排序支持区别
HashMap定义
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {}
TreeMap定义
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}
HashMap和TreeMap都继承自AbstractMap HashMap实现Map接口 TreeMap实现NavigableMap接口 NavigableMap是SortedMap的一种,实现对Map中key排序 即: TreeMap支持排序 HashMap不支持排序
区别2:构造函数区别
HashMap构造函数
public HashMap(int initialCapacity, float loadFactor) {} HashMap除默认无参构造函数之外 还可以接受两个参数initialCapacity(初始化容量)和loadFactor(加载因子) HashMap底层结构是Node数组 transient Node<K,V>[] table initialCapacity 是这个table数组初始容量 如果不传initialCapacity,HashMap提供默认值 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 当 HashMap 中存储的数据过多的时候,table 数组就会被装满 这时候就需要扩容 HashMap扩容是以2的倍数来进行 而loadFactor就指定何时进行扩容操作 默认的 loadFactor 是 0.75(即达到容量的 75%,则进行扩容) static final float DEFAULT_LOAD_FACTOR = 0.75f;
TreeMap构造函数
TreeMap底层是一个Entry private transient Entry<K,V> root 他的实现是一个红黑树 方便用来遍历和搜索 TreeMap 的构造函数可以传入一个 Comparator 实现自定义的比较方法。 public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
区别3:null值的区别
HashMap 可允许一个 null key 和多个 null value TreeMap 不允许 null key 但允许多个 null value
区别4:性能区别
1.HashMap 的底层是 Array 所以 HashMap 在添加,查找,删除等方法上面速度会非常快 TreeMap 的底层是一个 Tree 结构,所以速度会比较慢。 2.HashMap 因为要保存一个 Array, 所以会造成空间的浪费 TreeMap 只保存要保持的节点,所以占用的空间比较小。 3.HashMap 如果出现 hash 冲突的话,效率会变差 不过在 java8 进行 TreeNode 转换之后,效率有很大的提升。 4.TreeMap 在添加和删除节点的时候会进行重排序 会对性能有所影响。例:
//排序示例 @Test public void withOrderHashMap(){ Map<String, String> books = new HashMap<String, String>(); books.put("bob", "books"); books.put("c", "concurrent"); books.put("a", "a lock"); System.out.println(books); // {a=a lock, c=concurrent, bob=books} } @Test public void withOrderTreeMap(){ Map<String, String> books = new TreeMap<String, String>(); books.put("bob", "books"); books.put("c", "concurrent"); books.put("a", "a lock"); System.out.println(books); // {a=a lock, bob=books, c=concurrent} } //Null值示例 @Test public void withNullHashMap() { Map<String, String> hashmap = new HashMap<String, String>(); hashmap.put(null, null); System.out.println(hashmap); // {null=null} } @Test public void withNullTreeMap() { Map<String, String> treemap = new TreeMap<String, String>(); treemap.put(null, null); System.out.println(treemap); // java.lang.NullPointerException }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。