文档章节

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

 爱尚论坛
发布于 2015/03/24 11:30
字数 1264
阅读 1238
收藏 0

  首先介绍一下什么是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);

  }

  }http://www.yijiaqin.com/space-384968-do-blog-id-10890.html

© 著作权归作者所有

粉丝 0
博文 22
码字总数 18644
作品 0
武汉
私信 提问
集合系列开篇:为什么要学集合?

集合可以说是学习 Java 中最重要的一块知识点了,无论做任何业务系统,集合总是最为基础的那块 API。我第一次接触集合,是在我大三的时候,那时候去面试,面试官问我:你了解过集合吗?可惜那...

陈树义
08/23
0
0
Map与HashMap两种定义方式的区别

Java代码 Map<bluh> map1 = new HashMap<bluh>(); HashMap<bluh> map2 = new HashMap<bluh>(); 1.灵活性 定义为Map之后更灵活 今后才有可能在需要的时候替换为HashMap之外的其它实现如TreeM......

Airship
2015/01/24
46
0
2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/14
0
0
Java核心(四)你不知道的数据集合

导读:Map竟然不属于Java集合框架的子集?队列也和List一样属于集合的三大子集之一?更有队列的正确使用姿势,一起来看吧! Java中的集合通常指的是Collection下的三个集合框架List、Set、Q...

王磊的博客
2018/11/28
108
0
再谈Java数据结构—分析底层实现与应用注意事项

在回顾js数据结构,写《再谈js对象数据结构底层实现原理-object array map set》系列的时候,在来整理下java的数据结构。 java把内存分两种:一种是栈内存,另一种是堆内存 基本类型在栈区分...

zhoulujun
05/17
54
0

没有更多内容

加载失败,请刷新页面

加载更多

规则引擎

解决问题 版本迭代速度更不上业务变化,但是若多个业务同时变化,除了为每个业务设计专属配置项也不利于操作。就想服务接口单纯化,将复杂多变的业务逻辑交给规则引擎,让用户在web端或cs端自...

无极之岚
37分钟前
6
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
今天
396
10
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
10
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部