前几天,学习了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的键按顺序排列。让我们先看个例子看看什么叫作“键按顺序排列”。
输出:
因为TreeMap按照键的顺序进行排列对象,所以键的对象之间需要能够比较。我们可以实现comparable接口重写compareTo()方法。
输出结果:
3. HashTable
HashTable和HashMap类几乎是相同的,不同之处在于HashMap是不同步的,并且HashMap允许接收null值和null键。