六、Set和存储顺序
不同的Set实现具不同的行为,并且对于在特定的Set中放置的元素类型也有不同的要求。
Set(interface): 存入Set的每个元素都必须是唯一的,因为set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set和Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet *:为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()。因为速度所以首选,神秘的排序。
TreeSet:保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素顺序(插入顺序)。于是在使用迭代器遍历Set时,结果会按元素插入顺序显示,元素也必须实现hashCode()方法。
必须为Set创建equals()方法,只有HashSet和LinkHashSet需要hashCode()方法。但是良好的编程风格应该是重写equals()时跟着重写hashCode()。
如何为Set创建自定义元素类型:
class SetType { Integer i; String str; @Override public boolean equals(Object o) { return o instanceof SetType && (i.equals(((SetType) o).i)) && (str.equals(((SetType) o).str)); } } class HasType extends SetType { /** * 这里涉及到如何重写hashCode: * 1.取一个初始值17 * 2.对每一个重要字段(equals()方法里面比较的字段)进行一下操作: * a.filedHashValue = filed.hashCode(); * b.result = result*31+filedHashValue; */ @Override public int hashCode() { int result = 17; result = 31 * result + (i == null ? 0 : i.hashCode()); result = 31 * result + (str == null ? 0 : str.hashCode()); return result; } } class TreeType extends SetType implements Comparable<TreeType> { /** * compare要指定比较字段 */ @Override public int compareTo(TreeType arg) { return (arg.i < i ? -1 : (arg.i.equals(i) ? 0 : 1)); } }
SortedSet(TreeSet的)