我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > Java中HashMap和TreeMap的区别深入理解
总共48087条微博

动态微博

查看: 1230|回复: 0

Java中HashMap和TreeMap的区别深入理解

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-06-15 11:09:13 |只看该作者 |倒序浏览
    首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。
      HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
      HashMap 非线程安全 TreeMap 非线程安全
      线程安全
      在java里,线程安全一般体现在两个方面:
      1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized.如ArrayList和Vector,HashMap和Hashtable
      (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。
      2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。
      1.AbstractMap抽象类和SortedMap接口
      AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。
      SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。
      2.两种常规Map实现
      HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
      (1)HashMap(): 构建一个空的哈希映像
      (2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
      (3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
      (4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
      TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
      (1)TreeMap():构建一个空的映像树
      (2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
      (3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
      (4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
      3.两种常规Map性能
      HashMap:适用于在Map中插入、删除和定位元素。
      Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
      4.总结
      HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
      import java.util.HashMap;
      import java.util.Hashtable;
      import java.util.Iterator;
      import java.util.Map;
      import java.util.TreeMap;
      public class HashMaps {
      public static void main(String[] args) {
      Map<String, String> map = new HashMap<String, String>();
      map.put("a", "aaa");
      map.put("b", "bbb");
      map.put("c", "ccc");
      map.put("d", "ddd");
      Iterator<String> iterator = map.keySet()。iterator();
      while (iterator.hasNext()) {
      Object key = iterator.next();
      System.out.println("map.get(key) is :" + map.get(key));
      }
      // 定义HashTable,用来测试
      Hashtable<String, String> tab = new Hashtable<String, String>();
      tab.put("a", "aaa");
      tab.put("b", "bbb");
      tab.put("c", "ccc");
      tab.put("d", "ddd");
      Iterator<String> iterator_1 = tab.keySet()。iterator();
      while (iterator_1.hasNext()) {
      Object key = iterator_1.next();
      System.out.println("tab.get(key) is :" + tab.get(key));
      }
      TreeMap<String, String> tmp = new TreeMap<String, String>();
      tmp.put("a", "aaa");
      tmp.put("b", "bbb");
      tmp.put("c", "ccc");
      tmp.put("d", "cdc");
      Iterator<String> iterator_2 = tmp.keySet()。iterator();
      while (iterator_2.hasNext()) {
      Object key = iterator_2.next();
      System.out.println("tmp.get(key) is :" + tmp.get(key));
      }
      }
      }
      运行结果如下:
      map.get(key) is :ddd
      map.get(key) is :bbb
      map.get(key) is :ccc
      map.get(key) is :aaa
      tab.get(key) is :bbb
      tab.get(key) is :aaa
      tab.get(key) is :ddd
      tab.get(key) is :ccc
      tmp.get(key) is :aaa
      tmp.get(key) is :bbb
      tmp.get(key) is :ccc
      tmp.get(key) is :cdc
      HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。
      下面就要进入本文的主题了。先举个例子说明一下怎样使用HashMap:
      import java.util.*;
      public class Exp1 {
      public static void main(String[] args){
      HashMap h1=new HashMap();
      Random r1=new Random();
      for (int i=0;i<1000;i++){
      Integer t=new Integer(r1.nextInt(20));
      if (h1.containsKey(t))
      ((Ctime)h1.get(t))。count++;
      else
      h1.put(t, new Ctime());
      }
      System.out.println(h1);
      }
      }
      class Ctime{
      int count=1;
      public String toString(){
      return Integer.toString(count);
      }
      }


    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表