【Java】Map集合之TreeMap

 我  曾  踏  月  而  来  ,  只  因  你  在  山  中

目录

一、简介

二、操作方法

1. HashMap和TreeMap的排序问题

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值替换为其他字符时就可以正常运行:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离陌lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值