我 曾 踏 月 而 来 , 只 因 你 在 山 中
目录
2.HashMap和TreeMap的Key是否可以为null
一、简介
Map用于保存具有映射关系的数据,以<Key,Map>形式存储数据,key和value可以是任何类型的数据,key不允许重复,key和value之间存在单向的一对一关系,即通过一个指定的key总可以找到唯一与之对应的确定的value。
HashMap和TreeMap区别:
1. HashMap由数组+列表+红黑树组成;TreeMap仅由红黑树组成
2. HashMap的Key和 Value 都可以为 null;TreeMap:的Key 不能为 null , Value 可以为 null
3. HashMap:通过 hash 算法定位, 针对 hash 冲突的值, 采用列表和红黑树的方式存储, 一定 条件下可以相互转换. 红黑树中, 如果 hash 值一样,是通过 key 的 比较方法(可自定义)来计算红黑树所处的位置;
TreeMap:红黑树存储结构, 通过自定义 key 比较器或者默认的比较算法来进行定位红黑树节点的存储位置。
4. HashMap和TreeMap都继承自AbstractMap,不同的是HashMap实现的是Map接口,而TreeMap实现的是NavigableMap接口。NavigableMap是SortedMap的一种,实现了对Map中key的排序
5. HashMap不会对元素排序;TreeMap会对元素默认按key值进行自然排序
二、操作方法
TreeMap和操作方法与HashMap的操作方法基本一致,再次不做过多赘述,需要了解的可以阅读:【Java】Map集合之HashMap。本文只针对两者不同的地方进行讲述。
1. HashMap和TreeMap的排序问题
TreeMap<Object,Object> tmap = new TreeMap<Object,Object>();
tmap.put(22, "a");
tmap.put(66, "b");
tmap.put(3, "a");
System.out.println("TreeMap: "+tmap);//输出按key值自然排序
HashMap<Object,Object> hmap = new HashMap<Object,Object>();
hmap.put(22, "a");
hmap.put(66, "b");
hmap.put(3, "a");
System.out.println("HashMap: "+hmap);
由此可见HashMap中元素的排列是无序的,TreeMap中的元素是按key值升序排列。但是当关键字key只有一个字符时也能达到排序效果,如下所示:
TreeMap<Object,Object> tmap = new TreeMap<Object,Object>();
tmap.put(2, "a");
tmap.put(6, "b");
tmap.put(3, "a");
System.out.println("TreeMap: "+tmap);//输出按key值自然排序
HashMap<Object,Object> hmap = new HashMap<Object,Object>();
hmap.put(2, "a");
hmap.put(6, "b");
hmap.put(3, "a");
System.out.println("HashMap: "+hmap);
出现上述结果的原因是:HashMap在存放Node数组的下标的计算是对key值的hashcode取模得到的,而0-9的hashcode值就是ASII码,刚好是从48-57,在计算后刚好满足0-9的先后顺序,因此当key值为单个字符数造成了一种排序的假象,而当key值为多个字符时HashMap就不会出现类似的排序效果了。
2.HashMap和TreeMap的Key是否可以为null
如上图所示,当TreeMap的key值为null时,在添加时不会报错,但是在运行时则会报错,如下图所示:
当我们将TreeMap的key值替换为其他字符时就可以正常运行: