Posted on 2007-07-18 15:01
Matthew Chen 阅读(165)
评论(0) 编辑 收藏 所属分类:
Java SE
HashSet 类和 TreeSet 类
“集合框架”支持 Set 接口两种普通的实现:HashSet 和 TreeSet。在更多情况下,您会使用 HashSet 存储重复自由的集合。考虑到效率,添加到 HashSet 的对象需要采用恰当分配散列码的方式来实现 hashCode() 方法。虽然大多数系统类覆盖了 Object 中缺省的 hashCode() 实现,但创建您自己的要添加到 HashSet 的类时,别忘了覆盖 hashCode()。当您要从集合中以有序的方式抽取元素时,TreeSet 实现会有用处。为了能顺利进行,添加到 TreeSet 的元素必须是可排序的。 “集合框架”添加对 Comparable 元素的支持,在排序的“可比较的接口”部分中会详细介绍。我们暂且假定一棵树知道如何保持 java.lang 包装程序器类元素的有序状态。一般说来,先把元素添加到 HashSet,再把集合转换为 TreeSet 来进行有序遍历会更快。
为优化 HashSet 空间的使用,您可以调优初始容量和负载因子。TreeSet 不包含调优选项,因为树总是平衡的,保证了插入、删除、查询的性能为 log(n)。
HashSet 和 TreeSet 都实现 Cloneable 接口。
HashSet中重复添加相同元素,HashSet中只有一个这样的元素,并不重复。
TreeSet中元素按升序排列
HashMap 类和 TreeMap 类
“集合框架”提供两种常规的 Map 实现:HashMap 和 TreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在 Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按顺序遍历键,那么 TreeMap 会更好。根据集合大小,先把元素添加到 HashMap,再把这种映射转换成一个用于有序键遍历的 TreeMap 可能更快。使用 HashMap 要求添加的键类明确定义了 hashCode() 实现。有了 TreeMap 实现,添加到映射的元素一定是可排序的。我们将在排序中详细介绍。
为了优化 HashMap 空间的使用,您可以调优初始容量和负载因子。这个 TreeMap 没有调优选项,因为该树总处于平衡状态。
HashMap 和 TreeMap 都实现 Cloneable 接口。
HashMap中重复添加相同元素,HashMap中只有一个这样的元素,并不重复。
Hashtable 类和 Properties 类是 Map 接口的历史实现。
“集合框架”提供了个特殊的 Set 接口:SortedSet,它保持元素的有序顺序。
该接口为集的子集和它的两端(即头和尾)提供了访问方法。当您处理列表的子集时,更改子集会反映到源集。此外,更改源集也会反映在子集上。发生这种情况的原因在于子集由两端的元素而不是下标元素指定。此外,如果 fromElement 是源集的一部分,它就是子集的一部分。但如果 toElement 是源集的一部分,它却不是子集的一部分。如果您想要一个特殊的高端元素(to-element)在子集中,您必须找到下一个元素。对于一个 String 来说,下一个元素是个附带空字符的同一个字符串(string+"\0")。;
添加到 SortedSet 的元素必须实现 Comparable,否则您必须给它的实现类的构造函数提供一个 Comparator:TreeSet(您可以自己实现接口。但是“集合框架”只提供这样一个具体的实现类。)
“集合框架”提供了个特殊的Map 接口:SortedMap,它用来保持键的有序顺序。
此接口为映射的子集包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理 SortedMap 和处理 SortedSet 一样。“集合框架”提供的实现类是 TreeMap。
因为对于映射来说,每个键只能对应一个值,如果在添加一个键-值对时比较两个键产生了零返回值(通过 Comparable 的 compareTo() 方法或通过 Comparator 的 compare() 方法),那么,原始键对应值被新的值替代。如果两个元素相等,那还好。但如果不相等,那么您就应该修改比较方法,让比较方法和 equals() 的效果一致。