HashMap, TreeMap, Hashtable的区别

本文深入探讨了Java SE中HashMap、TreeMap与Hashtable的特点与应用场景,包括它们的数据结构、线程安全性及键值排序方式。特别关注自定义对象作为键时hashCode()与equals()方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天,学习了JAVA SE中的HashMap, TreeMap, Hashtable三个集合类,如果用一句话来分别概括他们的特点,就是:

  • HashMap就是一张hash表,键和值都没有排序。
  • TreeMap以红-黑树结构为基础,键值按顺序排列。
  • Hashtable是同步的(而HashMap是不同步的)。所以如果在线程安全的环境下应该多使用HashMap,而不是Hashtable,因为Hashtable对同步有额外的开销。
1. HashMap
如果HashMap的键(key)是自定义的对象,那么需要按规则定义它的equals()和hashCode()方法。

输出:

注意,我们将"小一"添加了两次,但是HashMap却接受了两次”小一“,这不合理(因为HashMap的键不应该重复),我们会搞不清楚怎么会出现两个小一,这两位学生是否是一个人。所以,Student类应该重写hashCode()方法和equals()方法,Student类应该定义如下:

重写后输出结果如下:

输出结果如上是因为HashMap不允许有两个相等的元素存在。默认情况下(也就是类没有实现hashCode()和equals()方法时),会使用Object类中的这两个方法。Object类中的hashCode()对于不同的对象会返回不同的整数,而只有两个引用指向的同样的对象时equals()才会返回true。

2. TreeMap
TreeMap的键按顺序排列。让我们先看个例子看看什么叫作“键按顺序排列”。


输出:

因为TreeMap按照键的顺序进行排列对象,所以键的对象之间需要能够比较。我们可以实现comparable接口重写compareTo()方法。

输出结果:

3. HashTable
HashTable和HashMap类几乎是相同的,不同之处在于HashMap是不同步的,并且HashMap允许接收null值和null键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值