日常开发中,何时使用HashMap,何时使用TreeMap?

戚薇 Java面经 发布时间:2023-06-28 17:07:45 阅读数:10551 1
下文笔者讲述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
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202306/16879432996923.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者